gpt4 book ai didi

c++ - 两个程序在本地循环中通信时互相阻塞

转载 作者:行者123 更新时间:2023-11-28 06:38:11 25 4
gpt4 key购买 nike

我已经编写了一个简单的 c++ 客户端,它应该通过 Ubuntu 14.04 上的本地循环使用监听器线程(在 Java 中下载的 EchoServer)与另一个程序通信。但是,在以下情况下会出现问题:

  1. 客户端连接到服务器
  2. 服务器发送问候消息
  3. 客户端接收消息并向服务器发送新消息
  4. 客户等待回答;主线程休眠,监听线程使用 recv() 等待响应

在下一步中,服务器应该会收到服务器发送的消息,但它没有。相反,它会在客户端终止后首先接收消息。

我认为问题是客户端阻塞了资源,因此不允许服务器接收消息,但我不确定。不幸的是,我无法在两台不同的机器上进行测试。

代码片段:

// main method
int main(void) {
Client client("127.0.0.1", 13050);
std::cout << client.open() << std::endl;
client.attachListener(foo);
usleep(1000 * 1000 * 2);
std::cout << client.send("hello") << std::endl;

usleep(1000 * 1000 * 5);
}

// send method
int Client::send(const char* msg) {
return write(sockfd, msg, strlen(msg));
}

// listener function
void* Client::listen() {
char buffer[256];
unsigned int receive_size = 0;
while(true) {
receive_size = 0;
while((receive_size = recv(sockfd, &buffer, 256, 0)) > 0) {
buffer[receive_size] = '\0';
msgHandler(buffer);
bzero(&buffer, 256);
}
if(receive_size == 0) {
msgHandler("Server disconnected");
} else if(receive_size == 1) {
msgHandler("Connection failure!");
}
}
return NULL;
}

输出: 1个 欢迎使用 Java EchoServer。输入“再见”关闭。 6

最佳答案

EchoServer 实现通常希望在您发送的消息中看到一个换行符,然后再回显它。而不是 client.send("hello") 试试 client.send("hello\n")

此外,虽然这对于您正在试验的应用程序来说并不是真正必要的,但您可能希望关闭 Nagle algorithm在您的客户端套接字上,以便立即发送小消息。在使用客户端套接字调用 connect 之后添加这样的代码:

int flag = 1;
int res = setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof flag);
if (res < 0) // handle setsockopt failure here...

此代码需要这些头文件:

#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>

关于c++ - 两个程序在本地循环中通信时互相阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26439372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com