re-connection using socket in c

 ̄綄美尐妖づ 提交于 2019-12-10 19:46:21

问题


im using socket in c and got success on send/recv. however, the problem is when my server crashes, the client has to reconnect the server (server runs after some time). so here what i did:

  1. create a socket
  2. connect
  3. recv/send
    • if recv size == 0 go to step 2.

this algorithm is not working for me. is there any ideas?

code:

int initSocket(char *servIP, unsigned short serverPort)
{
    portNum = serverPort;
    ipAddr = servIP;
                            /* Socket descriptor */
    struct sockaddr_in echoServAddr; /* Echo server address */

    if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
    {
        printf("socket() failed");
        bConnected = -1;
        return -1;
    }

    /* Construct the server address structure */
    memset(&echoServAddr, 0, sizeof(echoServAddr));     /* Zero out structure */
    echoServAddr.sin_family      = AF_INET;             /* Internet address family */
    echoServAddr.sin_addr.s_addr = inet_addr(ipAddr);   /* Server IP address */
    echoServAddr.sin_port        = htons(portNum);      /* Server port */

    struct timeval timeout;
    timeout.tv_sec = 0;
    timeout.tv_usec = 20000;

    if (setsockopt (sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) < 0)
        error("setsockopt failed\n");

    /*if (setsockopt (sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0)
         error("setsockopt failed\n");
    */
    /* Establish the connection to the echo server */
    if (connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0)
    {
        printf("connect() failed\n");
        bConnected = -1;
        //close(sock);
        return -1;
    }

    bConnected = 0;
    return 0;
}




--------------- if server crashes ------------
if(recv_size == 0)
            {
            // server crashed
                while(initSocket(ipAddr, portNum) < 0)
                {
                    printf("IP : %s\v", ipAddr);
                    printf("Port : %d\v", portNum);                 
                }

            } 
-----------------------------

回答1:


  1. create a socket
  2. connect
  3. recv/send if recv size == 0 go to step 2.

You cannot re-connect a TCP socket, you have to create a new one. You'd also want to handle the case where recv or send errors.

So this have to be:

  1. create a socket
  2. connect
  3. recv/send if recv returns <= 0 or send returns -1 (and it's not a timeout): close socket, goto step 1

Though, it seems your code already does all these steps, and not just repeating step 2 and 3, so it's a bit unclear what's the actual problem you are observing.

In addition, your initSocket() code does not close() the socket when connect() fails, so you'll easily leak sockets and run out of file descriptors in less than a second once the server fails, you have to close() the socket you just created if you're not going to use it.



来源:https://stackoverflow.com/questions/10534399/re-connection-using-socket-in-c

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!