C: connect () socket programming freezes

Hey everyone, I'm going to rip my hair out. I have this client who attempts to connect to the server, everything seems fine, using gethostbyname(), socket(), bind()but when you try connect()it just hangs there, and the server can not see anything on the client. I know that the server is running, because another client (also in C) can connect just fine. What makes the server not see this incoming connection? I am at the end of my mind. Two different clients are also very similar, so I lost even more.

    if (argc == 2)  {
    host = argv[1];         // server address
}
else    {
    printf("plz read the manual\n");
    exit(1);
}

hserver = gethostbyname(host);
if (hserver)    {
    printf("host found: %p\n", hserver);
    printf("host found: %s\n", hserver->h_name );
}
else    {
    printf("host not found\n");
    exit(1);
}

bzero((char * ) &server_address, sizeof(server_address)); // copy zeroes into string
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(hserver->h_addr);
server_address.sin_port = htons(SERVER_PORT);

bzero((char * ) &client_address, sizeof(client_address)); // copy zeroes into string
client_address.sin_family = AF_INET;
client_address.sin_addr.s_addr = htonl(INADDR_ANY);
client_address.sin_port = htons(SERVER_PORT);

sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
    exit(1);
else    {
    printf("socket is opened: %i \n", sockfd);
    info.sock_fd = sockfd;
    rv = fcntl(sockfd, F_SETFL, O_NONBLOCK); // socket set to NONBLOCK
    if(rv < 0)
        printf("nonblock failed: %i %s\n", errno, strerror(errno));
    else
        printf("socket is set nonblock\n");
}

timeout.tv_sec = 0;     // seconds
timeout.tv_usec = 500000; // micro seconds ( 0.5 seconds)
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval));

rv = bind(sockfd, (struct sockaddr *) &client_address, sizeof(client_address));
if (rv < 0)     {
    printf("MAIN: ERROR bind() %i: %s\n", errno, strerror(errno));
    exit(1);
}
else
    printf("socket is bound\n");

rv = connect(sockfd, (struct sockaddr *) &server_address, sizeof(server_address));
printf("rv = %i\n", rv);
if (rv < 0)     {
    printf("MAIN: ERROR connect() %i:  %s\n", errno, strerror(errno));
    exit(1);
}
else
    printf("connected\n");

Any thoughts or ideas are deeply deeply appreciated.

-transformation

EDIT: If the socket is NOT set to non-blocked, then it hangs. If the socket is set to non-blocked, I getERROR connect() 115: Operation now in progress

[EINPROGRESS]   O_NONBLOCK , ; .

, , .

+3
4

gethostbyname() , htonl(). , hostent->h_addr . :

server_address.sin_addr.s_addr = htonl(hserver->h_addr);

:

memcpy(&server_address.sin_addr, hserver->h_addr, hserver->h_length);
+3

, O_NONBLOCK.

, connect -1 errno EAGAIN .

, select() .

( select() ).

+1

, telnet ( ). , . telnet , .

0

, .

You are binding a client set. Your code directly associates a client socket with a fixed port (server port). This leaves O / S NOT free to choose the available port for the FROM connection. If one process has a dedicated port (it is successfully connected () and connected () to the server), then the other process cannot use the same port.

If there is no good reason to send traffic from a specific port, let O / S find the available port by changing this line

client_address.sin_port = htons(SERVER_PORT);

to

client_address.sin_port = 0;
0
source

Source: https://habr.com/ru/post/1741437/


All Articles