connect () не работает при программировании сокетов с использованием протокола IPv4 - PullRequest
0 голосов
/ 07 мая 2020

Я пишу клиентскую программу, но проблема, с которой я столкнулся: connect() сбой означает возврат отрицательного числа. Я слежу за книгой, пытаясь написать программу на основе программирования сокетов. При запуске программы из командной строки ./out 169.1.1.1 "Hello World!!" 7. Через некоторое время он отображает Ошибка подключения

Клиент. c Я имею в виду основной. c в моя программа


    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include "Practical.h"
    int main(int argc, char* args[]) {
        if(argc < 3 || argc > 4) {          //Program will be Exit if Invalid no. of Arguments is Passed.
            DieWithUserMessage("Program Arguments: ","Provide <./out, IP Address , Message and Port: 7>");
        }
        char * userIPAddress = args[1]; // First argument IP provide by the user separated by the . of 4 digits
        char * userMessage = args[2];   // Second argument message that user want to send to the server.
        in_port_t port = (argc == 4) ? atoi(args[3]) : 7; //4th argument which is : port number is optional , but if provided should convert to number.
        int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

        if(sock < 0) {
            DieWithSystemMessage("Socket Failed:");
        }
        //Now setting up Server Address
        struct sockaddr_in servAddress;
        memset(&servAddress, 0, sizeof(servAddress));
        servAddress.sin_family = AF_INET;
        int retValue = inet_pton(AF_INET, userIPAddress, &servAddress.sin_addr.s_addr);
        if(retValue < 0) {
            DieWithSystemMessage("IPv4 Conversion Failed");
        }
        if(retValue == 0) {
            DieWithUserMessage("Invalid, Pattern", "<IP Address Patern is Wrong/Miss spelled>");
        }
        servAddress.sin_port = htons(port);
        if(connect(sock, (struct sockaddr *)&servAddress, sizeof(servAddress)) < 0) {
            DieWithSystemMessage("Connect Failed");
        }
        size_t messagelength = strlen(userMessage);
        ssize_t numBytes = send(sock, userMessage, messagelength,0);
        if(numBytes < 0) {
            DieWithSystemMessage("Sending Failed");
        }
        if(numBytes < messagelength) {
            DieWithUserMessage("Sending Incomplete", "<Greater or Less number of bytes is send>");
        }

        return 0;
    }

DieWithMessage. c


    #include <stdio.h>
    #include <stdlib.h>

    void DieWithUserMessage(const char* mesg, const char* details) {
        fputs(mesg, stderr);
        fputs(details, stderr);
        fputc('\n', stderr);
        exit(0);
    }
    void DieWithSystemMessage(const char* mesge) {
        fputs(mesge, stderr);
        fputc('\n', stderr);
        exit(0);
    }

Practical.h


    void DieWithUserMessage(const char* mesg, const char* details);
    void DieWithSystemMessage(const char* mesge);

Makefile


    # _*_ Makefile _*_

    out: main.o DieWithMessage.o Practical.h
        gcc main.o DieWithMessage.o -o out
    main.o: main.c
        gcc main.c -c
    DieWithMessage.o: DieWithMessage.c
        gcc DieWithMessage.c -c
    clean:
        rm -f *.o out

Проблема здесь


    if(connect(sock, (struct sockaddr *)&servAddress, sizeof(servAddress)) < 0) {
            DieWithSystemMessage("Connect Failed");
        }

Еще не завершено Я собираюсь написать код для сервера, но сначала решу эту проблему

Вывод Вывод после выполнения

...