服务器没有收到来自客户端的多次写入
Server doesn't receive multiple write from client
下面的代码是simplified.I有一个带循环的服务器:
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时,我没有建立新的连接(因为它之前是通过之前的函数调用连接的)。
如果需要,我可以post整个代码。
您的服务器仅在连接上读取和写入一次,然后下一次循环迭代再次调用 accept
,这将阻塞直到有新连接或 return 错误值。在任何一种情况下,您都会覆盖文件描述符 fd_c
。因此服务器不再能够与旧连接通信。
接受一次连接,并保留文件描述符直到连接关闭,这样您就可以将其重新用于对 read
和 write
的调用。
下面的代码是simplified.I有一个带循环的服务器:
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时,我没有建立新的连接(因为它之前是通过之前的函数调用连接的)。
如果需要,我可以post整个代码。
您的服务器仅在连接上读取和写入一次,然后下一次循环迭代再次调用 accept
,这将阻塞直到有新连接或 return 错误值。在任何一种情况下,您都会覆盖文件描述符 fd_c
。因此服务器不再能够与旧连接通信。
接受一次连接,并保留文件描述符直到连接关闭,这样您就可以将其重新用于对 read
和 write
的调用。