C++ socket多线程通讯,开启多线程Recv消息,第一个recv线程正常,第二个Recv线程开启后第一个就不能接收到消息
//开启线程代码
int ServerSocket::OpenSocket()
{
//创建套接字
WORD myVersionRequest;
WSADATA wsaData;
myVersionRequest=MAKEWORD(1,1);
int err;
err=WSAStartup(myVersionRequest,&wsaData);
if (err)
{
return 1;
}
char *cp = LOCALHOST_IP;
JGlobal::s_sokcet = socket(AF_INET,SOCK_STREAM,0);//创建了可识别套接字
//需要绑定的参数
SOCKADDR_IN addr;
addr.sin_family=AF_INET;
//addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//ip地址,自动获取
addr.sin_addr.S_un.S_addr=inet_addr(cp);
addr.sin_port=htons(6000);//绑定端口
int ret = bind(JGlobal::s_sokcet,(SOCKADDR*)&addr,sizeof(SOCKADDR));//绑定完成
ret = listen(JGlobal::s_sokcet,10);//其中第二个参数代表能够接收的最多的连接数 ,无错误返回0
if(!ret)
{
//HANDLE hThreadR = CreateThread(NULL,0,AccpetCilentProc,NULL,0,NULL);
CWinThread *pAcceptThread = AfxBeginThread(AccpetCilentProc,NULL,0,0,0);
//JGlobal::s_pGetNewstVIPThread = CreateThread(NULL,0,JNetUtils::GetNewestVIPThreadFunc,NULL,0,NULL);//开启获取VIP新消息线程
}
return 0;
}
UINT ServerSocket::AccpetCilentProc(LPVOID lpParam)
{
//开始进行监听
SOCKADDR_IN clientsocket;
int len=sizeof(SOCKADDR);
while (JGlobal::s_sokcet)
{
SOCKET serConn=accept(JGlobal::s_sokcet,(SOCKADDR*)&clientsocket,&len);//如果这里不是accept而是conection的话。。就会不断的监听
//ULONG cilentAddr = clientsocket.sin_addr.S_un.S_addr;
char *cp = inet_ntoa(clientsocket.sin_addr);
//MessageBox(GetDesktopWindow(),JUtils::ctowc(cp),_T("有客户上线了!"),0);
ULONG ip = inet_addr(cp);
Cinfo cilentInfo;
cilentInfo.serConn = serConn;
cilentInfo.MemIp = ip;
if(serConn > 0)
{
CWinThread *pAcceptThread = AfxBeginThread(RecvCilentProc,LPVOID(&cilentInfo),0,0,0);
}
}
return 0;
}
//recv线程入口函数
UINT ServerSocket::RecvCilentProc(LPVOID lpPrama)
{
int icount = 0;
while(JGlobal::s_sokcet > 0&&((Cinfo*)lpPrama)->serConn > 0)
{
icount++;
Cinfo t_cinfo = {0};
int rret = 0;
rret = recv(((Cinfo*)lpPrama)->serConn,(char *)&t_cinfo,sizeof(Cinfo),0);
//接收到的信息,已经有用户名、会员等级、价格需求结构体、客户状态、手机号码,
//需要补充IP、套接字接口、发送时间
if(rret > 0)
{
//消息处理
}
}
}