18,356
社区成员
发帖
与我相关
我的任务
分享
void NThreadProc(void* p);
SOCKET NInitCreateSocket(int nID)
{
SOCKET connfd;
struct sockaddr_in servaddr;
char buff[128];
int n;
//printf("end %d", nPort);
if ((connfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
printf("create socket error: %d(errno: %d)\n", GetLastError(), nID);
return INVALID_SOCKET;
}
unsigned long ul = 1;
int ret = ioctlsocket(connfd, FIONBIO, (unsigned long*)&ul); //设置成非阻塞模式
if (ret == SOCKET_ERROR) //设置失败
{
printf("create socket error: %d(errno: %d)\n", GetLastError(), nID);
closesocket(connfd);
return INVALID_SOCKET;
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(nID +10333);
if (bind(connfd, (struct sockaddr*) & servaddr, sizeof(servaddr)) == -1) {
printf("bind socket error: %d(errno: %d)\n", GetLastError(), nID);
closesocket(connfd);
return INVALID_SOCKET;
}
DWORD TimeOut = 100;//设置接收超时6秒
if (::setsockopt(connfd, SOL_SOCKET, SO_RCVTIMEO, (char*)&TimeOut, sizeof(TimeOut)) == SOCKET_ERROR) {
closesocket(connfd);
printf("setsockopt error: %d(errno: %d)\n", GetLastError(), nID);
return INVALID_SOCKET;
}
return connfd;
}
int NConnect(SOCKET s,int nPort)
{
if (nPort > 65535)
{
closesocket(s);
if (nPort > 65535)
{
printf("thread %d,end time %d(ms),port %d\n", nPort % g_nCount ,GetTickCount() - g_uStartTime, nPort);
//delete g_SocketList;
//g_SocketList = NULL;
}
return 0;
}
struct sockaddr_in servaddr1;
memset(&servaddr1, 0, sizeof(servaddr1));
servaddr1.sin_family = AF_INET;
servaddr1.sin_port = htons(nPort);
servaddr1.sin_addr.S_un.S_addr = inet_addr(address);
connect(s, (struct sockaddr*) & servaddr1, sizeof(servaddr1));
fd_set writeset;
FD_ZERO(&writeset);
FD_SET(s, &writeset);
timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 10000000;
int ret = select(0, NULL, &writeset, NULL, &tv);
if (ret<= 0)
{
//closesocket(connfd);
NConnect(s, nPort + g_nCount);
return 0;
}
if (send(s, (char*)sendbuf, sizeof(sendbuf), 0) < 0) {
//closesocket(connfd);
NConnect(s, nPort + g_nCount);
printf("send msg error: %d(SOCKET: %d,send port =%d,ret = %d)\n", GetLastError(), s,nPort,ret);
return 0;
}
char buff[128] = {0};
//printf("======waiting for client's request======\n");
while (1) {
int n = recv(s, buff, 128, 0);
//buff[n] = '\0';
//printf("recv msg from client: %s\n", buff);
if(n > 0)
n = CompairType((BYTE*)buff);
if (n > 0)
{
g_port = nPort;
printf("\n port =%d,type %d\n", nPort, n);
printf("\n port =%d,type %d\n", nPort, n);
}
else
{
NConnect(s, nPort + g_nCount);
}
return 0;
}
}
int NInit(int nCount)
{
g_nCount = nCount;
g_SocketList = new SOCKET[nCount];
for (int i = 0; i < nCount; i++)
{
g_SocketList[i] = NInitCreateSocket(i);
}
printf("start time %d\n", g_uStartTime = GetTickCount());
for (int i = 0; i < nCount; i++)
{
POINT* pt = new POINT;
pt->x = g_SocketList[i];
pt->y = i;
_beginthread(NThreadProc, sizeof(POINT), pt);
}
return 0;
}
void NThreadProc(void* p)
{
POINT* p1 = (POINT*)p;
NConnect(p1->x,p1->y);
}
int main(int argc ,char** argv)
{
WSADATA a;
WSAStartup(MAKEWORD(1,0),&a);
/*int nPort = 80;
int nTime1 = GetTickCount();
for (int i = 0; i < 1000; i++)
{
int* a = new int[1];
a[0] = i;
_beginthread(ThreadProc,sizeof(int),a);
}
int nTime2 = GetTickCount();
printf("start time %d\n", nTime2);*/
NInit(100);
getchar();
WSACleanup();
}
//联机到服务器
BOOL bConnectOK = FALSE;
{
SOCKADDR_IN server;
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(m_dwServerIPAddr);
server.sin_port = htons((WORD)m_dwServerPort);
int iconnect = connect(m_CommSock, (struct sockaddr*)&server, sizeof(server));
if(iconnect == 0) //直接成功
{
bConnectOK = 1;
break;
}
fd_set writefds;
FD_ZERO(&writefds);
FD_SET(m_CommSock, &writefds);
timeval tOut = {1, 0};
if( select(0, NULL, &writefds, NULL, &tOut) > 0 && FD_ISSET(m_CommSock, &writefds) )
{
bConnectOK = 2;
break;
}
}while(0);
UINT g_uStartTime = 0;
UINT g_uEndTime = 0;
int g_nCount = 0;
SOCKET* g_SocketList = NULL;
把全局贴一下
我原来是起1000个线程,发现80结束的很快(80,1080,2080......66080)不知道为啥?
然后调试的时候发现定33X9条件断点不进入
各种奇怪问题,而且如果我从89开始跟,33X9能被检测到,但是不下断就无法被检测到怀疑是超时设置的问题,但不能确定