服务器未从客户端收到多次写入

时间:2019-08-25 01:45:21

标签: c sockets server client-server

以下代码被简化。我有一个带有循环的服务器:

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时,我没有建立新的连接(因为该连接先前已与先前的函数调用连接)。

如果需要,我可以发布整个代码。

1 个答案:

答案 0 :(得分:0)

您的服务器仅在连接上读写一次,然后下一次循环迭代再次调用accept,它将阻塞直到建立新连接或返回错误值。无论哪种情况,您都将覆盖文件描述符fd_c。因此,服务器不再能够与旧连接进行通信。

接受一次连接,并保留文件描述符,直到关闭连接为止,因此您可以将其重新用于对readwrite的调用。