c++多线程套接字无法接收客户端数据
C++ multithread socket cannot receive client data
我想创建一个多线程套接字服务器。我有服务器工作得很好,但是当我试图将我的代码移动到工作函数时,服务器在读取客户端数据时停止工作。
原始代码:main.cpp
int sock;
main(){
SocketServer *ss = new SocketServer(8888);
pthread_t thread;
if(ss != NULL){
while(true){
sock = ss->Accept();
char* out;
ss->GetRequest(sock, out);
}
}
}
SocketServer.cpp
void SocketServer::GetRequest(int msgsock, char* out){
char buf[1024];
int rval;
std::cout<<"before readn";
if ((rval = read(msgsock, buf, 1024)) < 0){
perror("reading socket");
}else{
strcpy(out,buf);
}
std::cout<<"after readn";
}
添加线程后:main.cpp
int sock;
main(){
SocketServer *ss = new SocketServer(8888);
pthread_t thread;
if(ss != NULL){
while(true){
sock = ss->Accept();
pthread_create(&thread, NULL, SocketThread, &(*ss));
pthread_detach(thread);
}
}
}
static void* SocketThread(void* lp){
SocketServer *ss = (SocketServer*) lp;
char* out;
ss->GetRequest(sock, out);
}
原始输出:之前读过
后读
新输出:之前读过
这是打破:
if ((rval = read(msgsock, buf, 1024)) < 0){
perror("reading socket");
}else{
strcpy(out,buf);
您将忽略rval
,除非它发出错误信号。应该是:
if ((rval = read(msgsock, buf, 1024)) < 0){
perror("reading socket");
else if (rval == 0) {
// peer closed the connection
close(msgsock); // or closesocket(), depending on your platform
break;
}else{
strncpy(out,buf,rval);
这个也被打破了:
sock = ss->Accept();
pthread_create(&thread, NULL, SocketThread, &(*ss));
开始处理客户端的线程对侦听套接字不感兴趣。它需要的是接受的套接字sock
,并且它需要以这样一种方式获得它,即在下一次调用时不会覆盖它。通常sock
是accept循环中的局部变量,并通过pthread_create()
传递。
相关文章:
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 将相机数据从服务器实时流式传输到客户端
- 不将数据 socket.io c++(客户端)发送到 nodejs(服务器)socket.io
- 在 1 个服务器 n 客户端套接字 C++ MFC 应用程序中更新数据的客户端
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- Java 客户端C++服务器数据发送/接收问题
- 如何从客户端在 gsoap C++ 的标头中传递非 xml 数据?
- 将数据发送到多个客户端 UDP 时不支持地址族
- 在C++中创建一个简单的数据包路由器,如何跟踪"客户端"?
- 在 MySQL 中运行 HTTP 服务器以从客户端接收数据
- cpp / c ++中的grpc客户端代码,元数据x-api-key/x-goog-api-key不起作用,给了我语音A
- 使用 Broadcast 发出的从节点服务器发送的数据不能被 C++ 套接字 IO 客户端读取
- 如何使用 asio 本地数据报构建回显服务器和客户端?
- 如何使用gRPC在客户端和服务器之间双向发送和接收流元数据
- 通过TCP将数据从C++客户端发送到JSON服务器
- 如何使客户端在将数据写入 C++ 管道之前检查服务器是否完成了从管道的读取操作
- C++中从客户端到服务器的数据传输问题
- Qt TCP服务器不从客户端读取数据
- gpsd客户端数据缓冲区
- c++多线程套接字无法接收客户端数据