18,363
社区成员




// 装入Winsock然后连接服务器
__declspec (dllexport) int LoadWinsockM(HWND hWnd,char *szIP,HWND m_child_wnd)
{
WSADATA wsd;
DWORD dwLen;
int nRet,nZero;
LPBYTE pBuf;
WSAPROTOCOL_INFO Protocol;
char szMessage[81];
if (WSAStartup(0x202,&wsd) != 0)
{
MessageBox(NULL,"hehe","Client Socket Error",MB_OK);
return 0;
}
dwLen = 0;
nRet = WSAEnumProtocols(NULL,NULL,&dwLen);
if (nRet == SOCKET_ERROR)
{
if (WSAGetLastError() != WSAENOBUFS)
return 0;
}
pBuf = malloc(dwLen);
nRet = SelectProtocols(SETFLAGS,NOTSETFLAGS,(LPWSAPROTOCOL_INFO)pBuf,&dwLen,&Protocol);
free(pBuf);
m_data[m_index].sClient = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,SOCK_STREAM);
if (m_data[m_index].sClient == INVALID_SOCKET)
return 1;
nZero = 0;
setsockopt(m_data[m_index].sClient,SOL_SOCKET,SO_RCVBUF,(char *)&nZero,sizeof(nZero));
m_data[m_index].server.sin_family = AF_INET;
m_data[m_index].server.sin_port = htons(m_data[m_index].port);
m_data[m_index].server.sin_addr.s_addr = inet_addr(szIP);
if (connect(m_data[m_index].sClient,(struct sockaddr *)&m_data[m_index].server,sizeof(m_data[m_index].server)) == SOCKET_ERROR)
{
int i=GetLastError();
return 0;
}
GetResolution();
SetGrids(hWnd);
memset(szMessage,'\0',sizeof(szMessage));
sprintf(szMessage,"WM_COMP;%d;0;0;0;\0",10);
SendCommandM(hWnd,1,szMessage,NULL);
UpdateRegionalScreen(hWnd,m_data[m_index].sClient,TRUE,m_child_wnd);
return m_data[m_index].sClient;
}
while (pThread->m_bSocketGo)
{
bOver = false;
FD_SET(pThread->m_RawSocket,&ReadFds);
FD_SET(pThread->m_RawSocket,&WriteFds);
if (pThread->m_ConStatus==enumConnecting)
{
time_out.tv_sec = CRawSock::s_nConTimeout;
status = select( 0,&ReadFds,&WriteFds,NULL,&time_out);
switch(status)
{
case SOCKET_ERROR:
bOver = true;
break;
case 0:
pThread->m_ConStatus = enumConFail;
pThread->m_pParentThrd->PostThreadMessage(MNG_OTHER_MSG,
MNG_CONOVER,false);
bOver = true;
break;
default:
if (FD_ISSET(pThread->m_RawSocket,&WriteFds))
{
pThread->m_ConStatus = enumConOK;
ioctlsocket(pThread->m_RawSocket,FIONBIO,&ul);
pThread->m_pParentThrd->PostThreadMessage(MNG_OTHER_MSG,
MNG_CONOVER,true);
}
else
{
bOver = true;
}
break;
}
if (bOver)
{
break;
}
}
else
{
iRcvLen = pThread->Receive(pThread->m_pRcvBuff,SOCK_RCV_MAX_BUFF);
if (iRcvLen==SOCKET_ERROR)
{
pThread->m_ConStatus = enumNotCon;
bRcvdOK = false;
bOver = true;
}
else
{
bRcvdOK = true;
}
if (bOver)
{
break;
}
}
Sleep(0);
}
int nTime;//你想设置的超时时间
int err=setsockopt(m_socket,SOL_SOCKET,SO_SNDTIMEO,(const char *)&nTime,sizeof(nTime));