-客户端-服务器应用程序-服务器端的recv()可以正常工作,但客户端的recv()会阻塞程序
C++ - client-server application - recv() on server is functional, but recv() on client blocks program
我正在编写客户机-服务器应用程序。到目前为止一切正常,客户端发送请求,服务器接收,解析。但是现在我想发送回一个答案,所以我复制了这两个函数,我把write()从客户机放到服务器上,把read()从服务器放到客户机上。
当我运行程序的时候,现在一切都阻塞了,服务器等待,客户端也等待。当我按ctrl+c客户机时,服务器解除阻塞并解析正确的请求并等待另一个请求。请问出什么事了?
来自客户端的部分代码:
params.port = atoi(params.pvalue.c_str());
hostent *host;
sockaddr_in socketHelper;
int clientSocket;
char buf[BUFFER_LEN];
int size;
string data;
string recieved;
// gets info about server
host = gethostbyname(params.hvalue.c_str());
if(host == NULL) {
printErr(ERR_HOSTNAME);
return ERR_HOSTNAME;
}
// makes a socket
if((clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
printErr(ERR_SOCKET);
return ERR_SOCKET;
}
socketHelper.sin_family = AF_INET;
socketHelper.sin_port = htons(params.port);
memcpy(&(socketHelper.sin_addr), host->h_addr, host->h_length);
// connects the socket
if(connect(clientSocket, (sockaddr *)&socketHelper, sizeof(socketHelper)) == -1) {
printErr(ERR_CONNECTION);
return ERR_CONNECTION;
}
// sends data
if((size = write(clientSocket, request.c_str(), request.length())) == -1) {
printErr(ERR_SEND);
return ERR_SEND;
}
// recieves data
while ((size = read(clientSocket, buf, BUFFER_LEN)) != 0) {
recieved.erase();
recieved.append(buf, size);
data = data + recieved;
}
// closes a connection
close(clientSocket);
和部分来自服务器的代码:
while(1) {
int clientSocket = accept(GodParticle, (struct sockaddr*) &GodAddr, &clientSocketSize);
if(clientSocket == -1) {
printErr(ERR_ACCEPT);
return ERR_ACCEPT;
}
if((pid = fork()) == 0) {
while ((size = read(clientSocket, buf, BUFFER_LEN)) != 0) {
recieved.erase();
recieved.append(buf, size);
request = request + recieved;
}
parserInput(request);
getData();
parserOutput();
if((size = write(clientSocket, sendback.c_str(), sendback.length())) == -1) {
printErr(ERR_SEND);
return ERR_SEND;
}
close(clientSocket);
exit(ERR_OK);
}
}
好的,让我这样回答。默认情况下,Recv()将阻塞程序,直到它从服务器接收到一些消息。
recv()没有阻塞服务器程序的原因是因为你使用fork()创建了子进程。
所以你必须使用一些其他方法来避免这个块(可能像使用select或其他一些东西)
相关文章:
- "unknown ca"自生成的 CA、证书和客户端/服务器
- 如何将函数集合传递给客户端类,以便将它们当作客户端类本身的成员使用
- 使用调试/崩溃报告将应用程序部署到客户端
- 如何在本地机器上运行c++和javascript客户端代码(hackerbank风格)
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 从服务器传输到客户端的消息不会出现
- OpenSSL TLS服务器-使用客户端证书白名单
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 提升 Asio TCP 服务器 处理多个客户端
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 如何绑定 C++ gRPC 客户端的网络接口
- C++套接字客户端到 Python 服务器未创建连接
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- TCP套接字(客户端-服务器)recv()返回-1值
- 仅通过建立一次TCP连接将Recv从客户端发送到服务器套接字
- TCP 服务器/客户端:客户端 recv() 返回空白缓冲区
- 由于PROTOBUF服务器中的字符串数据类型变量和客户端通过cpp中recv端的套接字进行通信,因此正在获取segfau
- -客户端-服务器应用程序-服务器端的recv()可以正常工作,但客户端的recv()会阻塞程序
- UDP客户端getsocketname()和服务器recv()的源端口不同