【问题标题】:Need Clarification in the socket server while loop需要在套接字服务器中说明 while 循环
【发布时间】:2014-06-24 16:04:51
【问题描述】:

以下是我的套接字服务器的部分代码。我不清楚一些步骤,所以我有一些问题。我的问题如下:

  1. 为什么我需要使用 while (1)?
  2. 退出 (-1) 的目的是什么,它会关闭我的套接字吗?
  3. 为什么 data_len 被初始化为 1?
  4. 如果服务器运行并且客户端没有数据,那么服务器会发生什么?它会被关闭吗?

其实我需要对下面这部分代码做一个详细的解释。

while(1) {
    if ((new = accept(sock, (struct sockaddr*)&client, &sockaddr_len)) == ERROR) {
        perror ("accept");
    exit (-1);

    }

    printf("New client connected from port no %d and IP %s\n",ntohs(client.sin_port), inet_ntoa(client.sin_addr));
data_len = 1;
while (data_len) {
    data_len = recv (new, data, MAX_DATA, 0);
    if (data_len) {
        send (new, data, data_len, 0);
    data [data_len]='\0';
    printf("Sent mesg: %s", data);
    }
}
printf("Client Disconnected\n");
close(new);
}
close (sock);

【问题讨论】:

  • 谨慎使用recv返回的结果。连接关闭时返回零(即 false),出错时返回 -1(非零,因此为 true)。

标签: c sockets serversocket socketserver localserversocket


【解决方案1】:

如果您想在完成第一个连接后接受新连接,则需要再次执行相同的代码来接受和处理新连接。最简单的方法是使用某种循环。

exit 函数只是退出您的进程。通常这将关闭所有打开的套接字并释放所有其他打开/分配的资源。该函数不返回。

如果不初始化data_len 变量,它的值将是不确定的,使用它会导致undefined behavior。至少如果变量是局部非静态变量。

如果没有来自客户端的数据,recv 调用将无限期阻塞。

【讨论】:

  • 约阿希姆·皮勒博格,谢谢!这只是一个问题的答案。但是我已经理解你的回答了。请尝试回答其他问题。我希望你能回答我所有的问题。
  • Joachim Pileborg,"recv 调用将无限期阻塞。"所以服务器会无限期地运行?
  • @user3751012 是的,直到客户端发送一些东西,客户端关闭连接或出现网络错误recv 函数根本不会返回,让您的服务器进程挂起。或者你当然会终止进程。
【解决方案2】:
while(1)

和

一样
while(true)

这意味着永远循环,直到有一个中断,但在这种情况下它不是 while(1) 它的 while(data_len > 0)

exit(-1)

将以退出代码 -1 结束程序。一般表示有错误

data_len 初始化为 1,以便代码进入 while 循环。这个值无论如何都会在循环的第一行被覆盖,所以 1 的值并不重要

【讨论】:

    【解决方案3】:

    1 用于永远循环,因为 C 没有原生布尔类型,所以它使用整数并且 1 为真

    2 那就是关闭应用程序,它在初始化套接字时在你的 if 语句下,所以套接字甚至还没有创建

    3 和 #1 一样,就是让 while 语句为真

    4 如果没有客户端连接,服务器将继续运行

    【讨论】:

      【解决方案4】:

      while (1) 永远循环,或者直到程序退出。

      exit(-1) 导致程序以非零值退出(这意味着发生了错误)。程序使用的资源在程序存在时被释放,所以是的,套接字将被关闭。

      datalen 被初始化为 1,因此 while 循环体将执行。

      如果没有传入数据,程序将耐心等待数据,假设您尚未创建非阻塞套接字。

      【讨论】:

        猜你喜欢
        • 2012-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-25
        • 1970-01-01
        相关资源
        最近更新 更多