使用读写函数的C语言中的套接字错误

时间:2014-08-29 21:02:25

标签: c++ c sockets networking

我正在尝试使用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);
}

这是对下面问题的补充,此时已过时。

我错过了冲洗或其他什么的电话吗?

Simulate Java's Thread class in C++

1 个答案:

答案 0 :(得分:2)

您的客户端和服务器不协调。客户端尽可能快地写入消息5次,服务器尽可能快地读取5次消息。在您的示例输出中,显然在您第一次拨打read()时,客户端已经发送了两次消息,而在第二次呼叫read()时,它又发送了两次。您read()最多256个字符,每次调用它时,它只会尝试读取当前缓冲区中的任何内容。如果客户端在此时间内发送了多条消息,read()将抓住所有内容。

您通常需要某种类型的同步,例如发送一条消息后,您的客户端会在发送第二条消息之前等待服务器发送"OK"或类似内容。除此之外,您可以使用某种消息结束标记(例如换行符),以便服务器可以区分它们,如果您的通信格式非常简单。