以下代码被简化。我有一个带有循环的服务器:
while(1){
fd_c = accept(fd_skt, NULL, 0);
reading = read(fd_c, buffer, 1024);
writen(fd_c, send_ok, msg_length);
}
和具有库的客户端,该库包含一个套接字和两个函数:
int fd_skt = -1;
int connection(){
fd_skt = socket(AF_UNIX, SOCK_STREAM, 0)
connect(fd_skt, (struct sockaddr *) &skt_address, sizeof(skt_address))
writen("hello");
readn();
}
int send_another_message(){
if(fd_skt < 0)
return error(ERR_SKT_NOT_READY);
writen("I am Bob");
readn();
}
如果我在客户端执行此操作,服务器将收到两个“ hello”:
connection();
connection();
但是如果我在客户端执行此操作,服务器将仅收到“ hello”而不是“ I am Bob”:
connection();
send_another_message();
服务器未收到消息。
当我使用send_another_message时,我没有建立新的连接(因为该连接先前已与先前的函数调用连接)。
如果需要,我可以发布整个代码。
答案 0 :(得分:0)
您的服务器仅在连接上读写一次,然后下一次循环迭代再次调用accept
,它将阻塞直到建立新连接或返回错误值。无论哪种情况,您都将覆盖文件描述符fd_c
。因此,服务器不再能够与旧连接进行通信。
接受一次连接,并保留文件描述符,直到关闭连接为止,因此您可以将其重新用于对read
和write
的调用。