【发布时间】:2016-02-14 20:53:49
【问题描述】:
我在 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 循环的顶部开始,在读取和写入之前递增计数。我可以依靠这种行为吗?还是让它可靠?
【问题讨论】:
-
fprintf(stderr,"From the client:\n%s",buffer);不好:read不要添加尾随 '\0' 所以buffer不是可打印的字符串(以这种方式)。 -
但是为什么孩子会跳出这个循环呢?你永远不会退出/返回/中断它(或者可能在
error()函数中,但它的内容没有显示。 -
缓冲区在这种情况下在写入之前填充了“\0”。
-
如果你得到准确(或更多)
buffsize数据怎么办(注意:“更多”意味着你将得到准确的 buffsize 数据,当然)?不管你的主要问题是什么,这段代码中没有任何内容让我们假设循环将结束。 -
如果
n为零,您应该关闭套接字并退出循环。如果n是负数,您应该记录错误,关闭套接字,然后退出循环。在这两种情况下,您都不应继续,就好像您已收到数据一样。如果n是正数,则应将其视为实际读取的字节数。不对尾随空值做任何假设。