在循环中需要在套接字服务器中进行澄清

时间:2014-06-24 16:04:52

标签: c sockets serversocket socketserver localserversocket

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

  1. 为什么我需要使用while(1)?
  2. 退出(-1)的目的是什么,它会关闭我的套接字吗?
  3. 为什么data_len被初始化为1?
  4. 如果服务器运行且客户端没有数据,那么服务器会发生什么?它会被关闭吗?
  5. 实际上,我需要对代码的以下部分进行详细说明。

    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 个答案:

答案 0 :(得分:3)

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

exit功能只会退出您的流程。通常,这将关闭所有打开的套接字以及释放所有其他打开/分配的资源。该功能不会返回。

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

如果客户端没有数据,recv调用将无限期阻止。

答案 1 :(得分:2)

while(1)

相同
while(true)

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

exit(-1)

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

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

答案 2 :(得分:1)

1它是永远循环,因为C没有本机布尔类型,它使用整数,1是真的

2关闭应用程序的那个,在初始化套接字时它在if语句下,因此套接字甚至没有创建

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

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

答案 3 :(得分:1)

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

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

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

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