0

在我的 C 应用程序中,我通过以下方式等待套接字上的数据:

printf("Opening socket and wait for data.\n");
while (i < 5)  
   while((connection_fd = accept(socket_fd, 
                            (struct sockaddr *) &address,
                            &address_length)) > -1)
   {
    bzero(buffer, 64);
    n = read(connection_fd,buffer,64);
    if (n < 0) printf("ERROR reading from socket");
    printf("Here is the message of length %d bytes:\n\n", n);
    for (int i = 0; i < n; i++)
    {
      printf("%02X", buffer[i]);
    } 
    printf("\n\n");          
    break;  
    }
 i++
 }

这意味着我从 Socket 读取了 5 次数据,但是,从外观上看,我似乎打开了 5 个不同的连接,对吗?是否可以只打开一次连接,使其保持活动状态,然后检查此连接上是否有可用数据?

谢谢,帕特里克!

4

5 回答 5

2

您的代码需要进行一些重组,每个新连接您应该只接受一次:

while (1) {
    connection_fd = accept(socket_fd, ...);

    /* check for errors */
    if (connection_fd < 0) {
      /* handle error */
    }

    /* note this could block, if you don't want
       that use non-blocking I/O and select */    
    while ((n=read(connection_fd, buf, ...)) > 0) {
        /* do some work */
    }

    /* close fd */ 
    close(fd);
}
于 2012-11-23T12:04:12.443 回答
0

当然。为此,您可能希望将参数交换到两个while()循环:

while ((connection_fd = accept(socket_fd, 
                          (struct sockaddr *) &address,
                          &address_length)) > -1)
  while (i < 5)  
  {
    ...
于 2012-11-23T11:58:24.773 回答
0

是的。取下while (i<5)钻头。之后,read如果需要,您可以读取更多数据。

于 2012-11-23T11:58:33.677 回答
0

这很简单。将调用 accept 函数的语句移到循环之外,然后使用相同的套接字描述符调用 read。

于 2012-11-23T11:59:17.257 回答
0
if (n < 0) printf("ERROR reading from socket");

你为什么要往前走?break;循环或新continue;连接。

于 2012-11-23T13:16:23.777 回答