Chinaunix
标题:
socket accept 的问题
[打印本页]
作者:
ar996
时间:
2011-12-17 21:20
标题:
socket accept 的问题
服务器端建立侦听 ,当多个客户端连接时 都很正常,当一个客户端 开启多个线程时(建立不同的socket),
发现服务器端accept 返回的socket 都是一样的,这样客户端接收数据就不正常了 。经常recv不到东西 。如果客户端开启多线程时 每个线程都延时一段时间 ,accept返回的socket 有时候就不一样了 ,还是有相同的时候 。
作者:
fangzz17
时间:
2011-12-18 16:25
把代码拉出来溜溜
作者:
crazyhadoop
时间:
2011-12-18 16:49
如果是每个线程处理一个连接应该不会有问题吧。若是多个竞争一个。。
作者:
ar996
时间:
2011-12-19 11:49
服务器端的侦听线程
DWORD WINAPI Fsocket::ListenThreadFunc(LPVOID Para)
{
SOCKET hSocket,hClientSocket;
struct sockaddr_in server,addr;
int addrlen = sizeof(addr);
char szIP[15+1];
int nErr;
CString str;
//设置侦听线程运行标志
m_bListenRun = true;
//创建 Listen SOCKET
if((hSocket = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET)
{
nErr = WSAGetLastError();
WriteTraceLog(TRACE_COMERR,nErr,"创建侦听通讯端口错误");
//设置侦听线程运行标志
m_bListenRun = false;
return -1;
}
//fill in server structure
ZeroMemory((char*)&server,sizeof(server));
server.sin_family = AF_INET;
if (strlen(theApp.m_sServer) > 0 && strcmp(theApp.m_sServer,"127.0.0.1") != 0)
{
unsigned long ip_addr = inet_addr(theApp.m_sServer);
CopyMemory((char *)&(server.sin_addr),(char *)&ip_addr,sizeof(server.sin_addr));
}
else server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(theApp.m_nPort);
//bind address to socket
if(bind(hSocket,(struct sockaddr *)&server,sizeof(server)) == SOCKET_ERROR)
{
nErr = WSAGetLastError();
WriteTraceLog(TRACE_COMERR,nErr,"绑定侦听IP和通讯端口错误");
closesocket(hSocket);
//设置侦听线程运行标志
m_bListenRun = false;
str.Format("绑定侦听IP[%s]和通讯端口[%d]错误\n\n可能的原因:\n1、IP地址不存在\n2、端口被占用\n3、其它用户已启动本程序",theApp.m_sServer,theApp.m_nPort);
AfxMessageBox(str);
// AfxMessageBox("绑定侦听IP和通讯端口错误\n\n该IP不存在或该端口可能被占用!");
return -1;
}
//侦听通讯端口
if (listen(hSocket,50) == SOCKET_ERROR)
{
nErr = WSAGetLastError();
WriteTraceLog(TRACE_COMERR,nErr,"准备侦听通讯端口错误");
closesocket(hSocket);
//设置侦听线程运行标志
m_bListenRun = false;
return -2;
}
int nError;
fd_set fds;
//设置检测状态,等待时间为1秒
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec= 10;
while(WaitForSingleObject(m_hListenExitEvent,5) != WAIT_OBJECT_0)
{
//检测侦听SOCKET的状态
FD_ZERO(&fds);
FD_SET(hSocket,&fds);
nError=select((int)hSocket+1,&fds,NULL,NULL,&timeout);
//发生错误
if (nError == SOCKET_ERROR)
{
int nErr;
nErr = WSAGetLastError();
WriteTraceLog(TRACE_COMERR,nErr,"侦听通讯端口错误");
break;
}
//无数据
if (nError == 0) continue;
//接受连接
hClientSocket = accept(hSocket,(struct sockaddr *)&addr,&addrlen);
if (hClientSocket == INVALID_SOCKET) continue;
strcpy_s(szIP,inet_ntoa(addr.sin_addr));
if (strcmp(theApp.m_szUsePool,"Y") != 0)
{
//创建通讯线程
if (!CreateClientThread(hClientSocket,szIP))
{
//创建失败
closesocket(hClientSocket);
}
}
else
{
int nTask;
//获取连接池资源
nTask = CTaskPool::GetClientTask(TIME_WAITSLOTRC);
if (nTask < 0)
{
//创建失败
closesocket(hClientSocket);
//
str.Format("侦听获得连接池错误,IP:%s",szIP);
WriteTraceLog(TRACE_COMERR,0,(char *)((LPCTSTR)str));
}
else
{
//向任务池中写入任务
CTaskPool::WriteClientTask(nTask,hClientSocket,szIP);
}
}
}
closesocket(hSocket);
//设置侦听线程运行标志
m_bListenRun = false;
return 0;
}
作者:
slata
时间:
2013-03-20 20:19
tcp 0 0 192.168.8.198:6183 192.168.11.46:52598 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:52085 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:51829 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:52597 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:52341 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:51828 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:52084 CLOSE_WAIT
tcp 1025 0 192.168.8.198:6183 192.168.11.46:52091 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:51835 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:52346 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:51834 CLOSE_WAIT
tcp 1025 0 192.168.8.198:6183 192.168.11.46:52090 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:51833 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:51832 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:52088 CLOSE_WAIT
tcp 1025 0 192.168.8.198:6183 192.168.11.46:52095 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:51839 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:51838 CLOSE_WAIT
tcp 1025 0 192.168.8.198:6183 192.168.11.46:52094 CLOSE_WAIT
tcp 1025 0 192.168.8.198:6183 192.168.11.46:52093 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:51837 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:51836 CLOSE_WAIT
tcp 1025 0 192.168.8.198:6183 192.168.11.46:52348 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:52067 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:51811 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:51810 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:52066 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:52065 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:51809 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:52576 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:51808 CLOSE_WAIT
tcp 1025 0 192.168.8.198:6183 192.168.11.46:52064 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:52071 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:51815 CLOSE_WAIT
tcp 0 0 192.168.8.198:6183 192.168.11.46:51814 CLOSE_WAIT
作者:
yulihua49
时间:
2013-03-21 09:57
ar996 发表于 2011-12-17 21:20
服务器端建立侦听 ,当多个客户端连接时 都很正常,当一个客户端 开启多个线程时(建立不同的socket),
发 ...
有这个问题,每创建一个线程需要usleep(5000);
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2