如何打开儿童插座?

时间:2015-11-13 09:55:02

标签: 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会话结束时会自动关闭,这是正确的吗?

当重新连接到当前的TCP会话时,子节点会在while循环的顶部开始,在读取和写入之前递增计数。我可以依靠这种行为吗?还是让它可靠?

1 个答案:

答案 0 :(得分:0)

首先编码问题:fprintf(stderr,"From the client:\n%s",buffer);。即使buffer以零为单位,您也可能获得bufsize个字节,因此fprintf将在缓冲区结束后读取数据。而且你处于一个循环中,所以每次阅读都可以给出不同的大小,所以你可以打印任何打印&#34;垃圾&#34;来自之前的缓冲内容。 你应该使用需要多个字符的函数来编写(即fwrite)。

另一点更像是&#34;风格&#34;问题:您从读取中获得n个字节,那么为什么要写回bufsize个字节而不是n?唯一的优势是具有恒定的尺寸&#34;消息。

对于内部循环,其中的任何函数都不能离开此循环,函数或程序。 您必须根据需要明确地离开循环(使用break)或函数(使用return)甚至程序(使用exit)。

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

所以这里有一个要点:尝试从/关闭套接字读取/写入只是从read/write函数返回-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
    }
  }
}