【问题标题】:re-connection using socket in c在c中使用套接字重新连接
【发布时间】:2012-05-10 12:51:52
【问题描述】:

我在 c 中使用套接字并成功发送/接收。但是,问题是当我的服务器崩溃时,客户端必须重新连接服务器(服务器在一段时间后运行)。 所以这就是我所做的:

  1. 创建一个套接字
  2. 连接
  3. 接收/发送
    • 如果接收大小 == 0 转到第 2 步。

这个算法对我不起作用。 有什么想法吗?

代码:

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);                 
                }

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

【问题讨论】:

  • 您说“它不工作”是怎么回事……是通过errno 返回的错误,或者您挂起等?
  • 您将套接字设置为 20 毫秒超时。如果客户端在超时之前没有从服务器接收到任何东西会发生什么?它不会认为服务器又崩溃了吗?
  • 感谢您帮助大家。 Jason,让我们看看这个场景,客户端连接到正在运行的服务器。服务器突然崩溃,客户端无法发送/接收任何内容。因此,服务器再次运行(假设有人再次加载它)客户端尝试重新连接(客户端还没有崩溃。)我做了上述步骤并再次创建套接字,但什么也没发生。程序刚刚睡了。

标签: c sockets tcp-ip


【解决方案1】:
  1. 创建一个套接字
  2. 连接
  3. 如果接收大小 == 0 则接收/发送,转到第 2 步。

你不能重新连接一个 TCP 套接字,你必须创建一个新的。 您还需要处理接收或发送错误的情况。

所以这必须是:

  1. 创建一个套接字
  2. 连接
  3. 接收/发送 如果 recv 返回

不过,您的代码似乎已经完成了所有这些步骤,而不仅仅是重复第 2 步和第 3 步,所以有点不清楚您观察到的实际问题是什么。

此外,当 connect() 失败时,您的 initSocket() 代码不会关闭()套接字,因此一旦服务器失败,您很容易泄漏套接字并在不到一秒的时间内用完文件描述符, 如果您不打算使用它,则必须 close() 刚刚创建的套接字。

【讨论】:

  • 您好,我之前确实尝试过您的方法,但结果相同。我还无法重新连接。
  • @mashhur 好吧,您确定您的服务器已重新启动并运行,并且真的在侦听套接字吗? (您可能至少必须在服务器端使用 SO_REUSEADDR ,否则您必须等待几分钟才能再次绑定到相同的本地端口。)您还需要清楚地描述实际问题是什么,也就是说,发生了什么,应该发生什么,你做了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 2020-10-27
  • 1970-01-01
  • 2016-07-06
相关资源
最近更新 更多