我在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循环的顶部开始,在读取和写入之前递增计数。我可以依靠这种行为吗?还是让它可靠?
答案 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
}
}
}