让子线程处理Socket的问题

chengkang828 2014-05-12 12:22:46
我做了个Socket通讯程序,现在是这样设计的:
在主线程里读取配置文件中的IP地址,然后CreateSocket()创建Socket连接,部分代码如下:


WSADATA WSAData;
int nRc = WSAStartup( MAKEWORD( 2, 2 ), &WSAData );

for(int i=0; i<SocketNum; i++)
{
DWORD dwip;
SOCKADDR_IN sockStruct; // Socket 结构

if((dwip = inet_addr(strIpList[i])) == INADDR_NONE) // Ip地址转换
{
// 表示Socket 的 IP 地址格式不正确,不是xxx.xxx.xxx.xxx格式
continue;
}

socketList[i] = socket(AF_INET, SOCK_STREAM, 0); // 创建TCP socket

sockStruct.sin_family=AF_INET;
sockStruct.sin_port=htons(SocketPort[i]); // Socket 端口
sockStruct.sin_addr.S_un.S_addr = dwip; // Socket IP

if(connect(socketList[i], (LPSOCKADDR)&sockStruct,sizeof(sockStruct)) == SOCKET_ERROR) // 连接Socket
{
int err = WSAGetLastError();
socketConStatus[i] = err;
continue;
}
else
{
SocketConnNum++;
socketConStatus[i] = 0;
}

if(WSAAsyncSelect(socketList[i], m_hWnd, WM_SOCKETEVENT,
FD_READ | FD_WRITE | FD_CLOSE) == SOCKET_ERROR)
{
// 表示注册网络异步事件失败
WSACleanup();
continue;
}
}


同时注册了3个事件,用来分别处理Socket的发送、接收和关闭


void SOCKET_OnSend(SOCKET CurSock);
void SOCKET_OnReceive(SOCKET CurSock);
void SOCKET_OnClose(SOCKET CurSock);


在SOCKET_OnReceive(SOCKET CurSock)函数里接收数据,然后存放到缓存,并调用:

FrameParse(dataBuff, LastBuffLen+RevLen, CurSock); // 分析得到的数据包

FrameParse()函数对数据做解析,然后通过调用其他接口将数据写入到别的系统里。
这些功能都已经测试运行很正常了,但现在遇到一个问题:

由于对方发送过来的数据非常快,每秒10~20K,而且是一刻不停的源源不断的发送。现在只有一个线程处理的情况,根本来不及处理,所以我想把Socket接收数据和解析数据包的过程放到一个线程里去。但不知道应该怎么做?请高手指导,或者有什么例子,或者给个思路。我比较不明白的是:让子线程处理Socket的接收,是将整个Socket的创建就在子线程做,还是只是把接收处理放到子线程?那3个事件要怎么写到子线程去?
...全文
318 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bsnry 2014-05-13
  • 打赏
  • 举报
回复
引用 5 楼 oldmtn 的回复:
[quote=引用 4 楼 chengkang828 的回复:] [quote=引用 2 楼 oldmtn 的回复:] [quote=引用 1 楼 VisualEleven 的回复:] 逻辑上分开,接收数据的线程和解析数据包的线程都是单独的线程。
另外可以使用队列[/quote] 使用队列是个好办法,不过这样数据很多,是不是会造成程序消耗大量内存呢?[/quote] 可以预分配内存,将队列扩展为循环队列。[/quote] 有例子吗,可以提供一个不?
oldmtn 2014-05-13
  • 打赏
  • 举报
回复
引用 4 楼 chengkang828 的回复:
[quote=引用 2 楼 oldmtn 的回复:] [quote=引用 1 楼 VisualEleven 的回复:] 逻辑上分开,接收数据的线程和解析数据包的线程都是单独的线程。
另外可以使用队列[/quote] 使用队列是个好办法,不过这样数据很多,是不是会造成程序消耗大量内存呢?[/quote] 可以预分配内存,将队列扩展为循环队列。
chengkang828 2014-05-12
  • 打赏
  • 举报
回复
引用 2 楼 oldmtn 的回复:
[quote=引用 1 楼 VisualEleven 的回复:] 逻辑上分开,接收数据的线程和解析数据包的线程都是单独的线程。
另外可以使用队列[/quote] 使用队列是个好办法,不过这样数据很多,是不是会造成程序消耗大量内存呢?
chengkang828 2014-05-12
  • 打赏
  • 举报
回复
引用 1 楼 VisualEleven 的回复:
逻辑上分开,接收数据的线程和解析数据包的线程都是单独的线程。
那创建socket还是在主线程吗? 接收数据(或解析数据)是通过消息告诉子线程吗? 麻烦具体说下,谢谢
oldmtn 2014-05-12
  • 打赏
  • 举报
回复
引用 1 楼 VisualEleven 的回复:
逻辑上分开,接收数据的线程和解析数据包的线程都是单独的线程。
另外可以使用队列
Eleven 2014-05-12
  • 打赏
  • 举报
回复
逻辑上分开,接收数据的线程和解析数据包的线程都是单独的线程。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧