怎么运用线程处理socket

平时socket接收数据我是通过OnReceive函数接收,如果我要通过线程循环接收的话,需要怎么处理?(处理函数应该写在线程里的吧,如果还写在OnReceive里不可以... 平时socket接收数据我是通过OnReceive函数接收,如果我要通过线程循环接收的话,需要怎么处理?
(处理函数应该写在线程里的吧,如果还写在OnReceive里不可以的?)
还有。如果我的服务器和一个客户端连接中,既要和这个客户端发送图片,又要发送数据。是不是要开2个线程,2个socket
展开
 我来答
shb8845369
2014-05-15 · TA获得超过280个赞
知道小有建树答主
回答量:138
采纳率:0%
帮助的人:167万
展开全部
处理函数写在线程里,发送一个线程,接收一个线程,这样发送接收就不会相互阻塞对方了。在发送/接收线程里一个死循环,不断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;
            }
        }
    }
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式