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

Socket error in C using read and write functions

本文关键字:套接字 错误 读写 函数      更新时间:2023-10-16

我正试图在C中使用linux网络编程读取和写入套接字。我分别在客户端和服务器程序中成功地调用了"写入"answers"读取"。

我很难理解的部分是,在我的客户端程序上,我循环并调用write 5次,在服务器上,循环并调用read 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);
}

这是对下面这个问题的补充,现在这个问题已经过时了。

我是不是错过了冲水的电话?

模拟Java';C++中的s线程类

您的客户端和服务器只是不协调。客户端以5倍的速度写入消息,服务器以5倍速度读取消息。在您的示例输出中,很明显,在您对read()的第一次调用中,客户端已经发送了两次消息,在对read()的第二次调用中它又发送了两个消息。read()最多256个字符,每次调用它时,它只会尝试读取当前缓冲区中的任何内容。如果到那时客户端已经发送了多条消息,那么read()将获取所有消息。

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