怎么运用线程处理socket
平时socket接收数据我是通过OnReceive函数接收,如果我要通过线程循环接收的话,需要怎么处理?(处理函数应该写在线程里的吧,如果还写在OnReceive里不可以...
平时socket接收数据我是通过OnReceive函数接收,如果我要通过线程循环接收的话,需要怎么处理?
(处理函数应该写在线程里的吧,如果还写在OnReceive里不可以的?)
还有。如果我的服务器和一个客户端连接中,既要和这个客户端发送图片,又要发送数据。是不是要开2个线程,2个socket 展开
(处理函数应该写在线程里的吧,如果还写在OnReceive里不可以的?)
还有。如果我的服务器和一个客户端连接中,既要和这个客户端发送图片,又要发送数据。是不是要开2个线程,2个socket 展开
1个回答
展开全部
处理函数写在线程里,发送一个线程,接收一个线程,这样发送接收就不会相互阻塞对方了。在发送/接收线程里一个死循环,不断OnReceive数据进来同时调用PeekMessage()获取其他线程发送过来的自定义消息,如果客户端发过来的包裹解析比较复杂,可以再开辟一个线程去处理,处理完后,PostThreadMessage给发送线程。发送线程和接受线程都对应同一个客户,因此socket只要一个就行了。socket是用来标识用户的(里面有IP地址,端口号等,这些组合起来就是全球唯一的了),两个socket说明是两个不同的客户,因此发送图片,又要发送数据需要自定义一个结构体包头,用来区分发送的包裹是图片还是数据。
追问
在发送/接收线程里一个死循环,不断OnReceive数据进来同时调用PeekMessage()获取其他线程发送过来的自定义消息
这句话怎么理解啊?我在线程里怎么调用OnReceive?
追答
typedef struct reciveParams
{ SOCKET socket;
HWND hwndView;
}ReceiveParams;
#define RECV_BUFFER_SIZE 1000
UINT __cdecl ReceiveThreadProc(LPVOID pParam)
{ ReceiveParams* pParams = (ReceiveParams*)pParam;
SOCKET receiveSocket = pParams->socket;
HWND hwndView = pParams->hwndView;
MSG msg;
while(TRUE)
{if(PeekMessage(&msg,NULL,0,0))
{ switch(msg.message)
{ case WM_USER_DEFINE_MSG_1:
// 处理消息1
break;
case WM_USER_DEFINE_MSG_2:
// 处理消息2
break;
default:
break;
}
}else{
int buffer[RECV_BUFFER_SIZE];
int leftReadBytes = RECV_BUFFER_SIZE;
int alreadyRecvBytes;
while(leftReadBytes)
{ alreadyRecvBytes = recv(socket,buffer,leftReadBytes,0)
buffer += alreadyRecvBytes;
leftReadBytes -= alreadyRecvBytes;
}
}
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询