我在 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/