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

标签 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:

如您所见,预期输出和实际输出不同。看起来客户端能够在实际发送之前调用“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 之类的调用?

Simulate Java's Thread class in C++

最佳答案

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

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

关于c++ - C中使用读写函数的套接字错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25576218/

相关文章:

c - OpenSSL 中的 BIGNUM 初始化错误

C函数fwrite()不写入文件

从客户端套接字读取时的C#AsyncSockets递归

python - 套接字 'No route to host' 错误

c++ - 必须在赋值中赋值

python - Telegram bot.polling() 上的 socket.timeout

c++ - 无法使用 lambda 函数创建 unordered_set

c++ - 在基于 Eclipse 的 IDE 中调试 C++ - 有类似 "step over loop/cycle"的东西吗?

c++ - 带有 Boost.Asio 的数据报 Unix 域套接字

python - Numpy C API - 使用 PyArray_Descr 进行数组创建会导致段错误