2

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

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

4 回答 4

3

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

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

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

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

于 2014-06-24T16:08:31.047 回答
2
while(1)

是相同的

while(true)

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

exit(-1)

将以退出代码 -1 结束程序。一般意味着有错误

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

于 2014-06-24T16:09:54.873 回答
1

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

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

3 与#1 相同,是否使while 语句为真

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

于 2014-06-24T16:11:52.627 回答
1

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

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

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

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

于 2014-06-24T16:12:36.927 回答