我正在尝试使用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:
如您所见,预期输出和实际输出不同。看起来客户端能够在实际发送之前调用“写入”两次。
这就是我对客户端代码的看法
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);
}
这是对下面问题的补充,此时已过时。
我错过了冲洗或其他什么的电话吗?
答案 0 :(得分:2)
您的客户端和服务器不协调。客户端尽可能快地写入消息5次,服务器尽可能快地读取5次消息。在您的示例输出中,显然在您第一次拨打read()
时,客户端已经发送了两次消息,而在第二次呼叫read()
时,它又发送了两次。您read()
最多256个字符,每次调用它时,它只会尝试读取当前缓冲区中的任何内容。如果客户端在此时间内发送了多条消息,read()
将抓住所有内容。
您通常需要某种类型的同步,例如发送一条消息后,您的客户端会在发送第二条消息之前等待服务器发送"OK"
或类似内容。除此之外,您可以使用某种消息结束标记(例如换行符),以便服务器可以区分它们,如果您的通信格式非常简单。