我正在尝试使用 C 中的 linux 网络编程来读取和写入套接字。我分别在客户端和服务器程序中成功调用了“写入”和“读取”。
我难以理解的部分是,在我的客户端程序上,我循环并调用了 5 次不同的写入,在服务器上,我循环并调用了 5 次不同的读取。
这是预期的输出:
MSG: I got your message MSG: I got your message MSG: I got your message MSG: I got your message MSG: I got your message
这是实际输出:
MSG: I got your messageI got your messageMSG: I got your messageI got your messageMSG: I got your messageMSG: MSG:
如您所见,预期输出和实际输出不同。看起来客户端能够在实际发送之前调用“write”两次。
这是我的客户端代码
for(int i=0;i<5;i++)
{
int n = write(ssocket.socketFileDescriptor,"I got your message",18);
cout<<n<<" number of bytes written."<<endl;
if (n < 0) socketError("ERROR writing to socket");
}
这是服务器代码:
void* run(void* arg)
{
ServerSocket* ss = (ServerSocket*)arg;
//while(true)
for(int i=0;i<5;i++)
{
char buffer[256];
bzero(buffer,256);
int n = read(ss->newsockfd,buffer,256);
printf("MSG: %s",buffer);
}
close(ss->newsockfd);
}
这是对以下问题的补充,目前已过时。
我是不是错过了 flush 之类的调用?
最佳答案
您的客户端和服务器不协调。客户端以 5 倍的速度写入消息,服务器以 5 倍的速度读取消息。在您的示例输出中,显然在您第一次调用 read()
时,客户端发送了两次消息,而在第二次调用 read()
时,它又发送了一次两次。您 read()
最多 256 个字符,每次调用它时,它都会尝试读取当前缓冲区中的任何内容。如果此时客户端已发送多条消息,read()
将获取所有内容。
您通常需要某种类型的同步,例如在您发送一条消息后,您的客户端会等待服务器发送 "OK"
或类似的内容,然后再发送第二条消息。除此之外,如果您的通信格式非常简单,您可以使用某种消息结束标记(例如换行符)以便服务器可以区分它们。
关于c++ - C中使用读写函数的套接字错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25576218/