c - 打开的子套接字如何关闭?

标签 c sockets

我在 while(1) 循环上生成了一个子进程,该进程似乎接受正在进行的 TCP 连接。我正在寻找套接字子进程的“正常”行为的确认,假设父进程没有死亡(我发现了很多关于如何在父进程死亡时杀死子进程的建议......)。

void 
dostuff (int sock, int* count)
{
  while(1){
    *count = *count +1;

    char cnt[20];
    sprintf(cnt, "count: %d\n", *count);

    int n;
    char buffer[bufsize];       
    bzero(buffer,bufsize);

    n = read(sock,buffer,bufsize);
    if (n < 0) error("ERROR reading from socket");
    fprintf(stderr,"From the client:\n%s",buffer);

    char reply[bufsize];
    bzero(reply, bufsize);
    strcat(reply, cnt);

    n = write(sock, reply, bufsize);
    if (n < 0) error("ERROR writing to socket");
  }
}

我怀疑子进程在其 TCP session 完成后会自动关闭,这是正确的吗?

当重新连接到当前的 TCP session 时,子进程实际上从 while 循环的顶部开始,在读取和写入之前递增计数。我可以依赖这种行为吗?或者使其可靠?

最佳答案

首先是编码问题:fprintf(stderr,"From the client:\n%s",buffer);。即使 buffer 用零初始化,您也可能会获得 bufsize 字节,因此 fprintf 将在缓冲区结束后读取数据。而且您处于循环中,因此每次读取都可能给出不同的大小,因此您可能会从以前的缓冲区内容中打印“垃圾”。 您应该使用需要写入多个字符的函数(即 fwrite)。

另一点更多的是“风格”问题:您从读取中获得了 n 字节,那么为什么写回 bufsize 字节而不是 n?唯一的优点是拥有“恒定大小”的消息。

对于内部循环,其中的任何函数都无法离开此循环、函数或程序。 您必须显式离开循环(使用 break)或函数(使用 return),甚至程序(使用 exit),具体取决于您的情况。需求。

在当前状态下,该函数从套接字读取。然后它会打印一条错误消息,但会继续其工作(由您决定在发生读取错误时该怎么做)。在它打印消息(可能是前一条消息,因为您不清理内容)并写入套接字之后,这将失败(如果套接字关闭,您将无法读取,也无法写入)。

所以这里的要点是:尝试从关闭的套接字读取/写入到关闭的套接字只会从读/写函数返回-1。之后做什么由您决定。

该函数应如下所示:

void dostuff (int sock, int* count) {
  while(1){
    int n;
    *count = *count + 1;
    char buffer[bufsize];
    n = read(sock,buffer,bufsize);
    if (n <= 0) {
      error("ERROR reading from socket (or EOF)");
      close(sock); // close our side whatever
      break;  // leave the loop (or return)
    }
    fprintf(stderr,"From the client:\n");
    fwrite(buffer, 1, n, stderr); // write the n elements
    char reply[bufsize];
    reply[0] = '\0';  // no need to clear all buffer
    strcat(reply, cnt);
    n = write(sock, reply, n);  // just write N elements
    if (n < 0) {
      error("ERROR writing to socket");
      close(sock); // close our side whatever
      break; // not able to write -> problem
    }
  }
}

关于c - 打开的子套接字如何关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33689965/

相关文章:

c - 为什么 MISRA-C 在某些情况下不允许隐式扩大类型?

c - 用于编译 C 文件的 emacs 键绑定(bind)

java - 要使用凯撒密码身份验证在 Java 中编写客户端服务器套接字程序,我需要了解什么?

c++ - 没有匹配的调用函数

node.js - 递归使用 socket.pipe 时的 MaxListenersExceededWarning

java - 通过不同计算机上的套接字发送大文件

php - 发送具有前导长度值的套接字数据

c - strcpy 和 "="有什么区别?

c++ - 当通过名称引用时,名称存储在哪里?

c - 我如何免费包含数据集和linked_data的数据库