15,472
社区成员
发帖
与我相关
我的任务
分享
#define WM_USERMSG WM_USER+101
int OpenSocket(CString SendData)
{
HANDLE hThread;
unsigned int ThreadID=0;
DWORD AIExitCode;
if(ThreadID!=0)//看看线程是否是第一次建立
{
GetExitCodeThread(hThread,&AIExitCode);//捕捉线程
if(AIExitCode==STILL_ACTIVE)
{//如果线程存在,就不需要建立新线程
PostThreadMessage(ThreadID,WM_USERMSG,0,(LPARAM)SendData); //第一处错
return 0; //发送完成后返回
}
}
m_hEvent=CreateEvent(NULL,FALSE,FALSE,"socketdll");
hThread = (HANDLE)_beginthreadex(NULL,0,NewThread,0,0,&ThreadID);
if(hThread == 0)
{
//printf("start thread failed,errno:%d\n",::GetLastError());
CloseHandle(m_hEvent);
return 1;
}
Sleep(10);
WaitForSingleObject(m_hEvent,INFINITE);
CloseHandle(m_hEvent);
return 0;
}
static unsigned WINAPI NewThread(void *arg)
{
if(SocketClose || StartEnv())
return 0;
sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr(QSerAddress);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(QSerPort);
if(INVALID_SOCKET == connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)))
{
closesocket(sockClient);
WSACleanup();
return 0;
}
int buflen = 0;
setsockopt(sockClient,SOL_SOCKET,SO_SNDBUF,(const char*)&buflen,sizeof(buflen));
MSG msg;
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
if(!SetEvent(m_hEvent)) //set thread start event
{
return 1;
}
while (1)
{
if(GetMessage(&msg,0,0,0)) //get msg from message queue
{
switch(msg.message)
{
case WM_USERMSG:
if(0 > send(sockClient,msg.lParam,strlen(msg.lParam)+1,0))//第二处错
{
Sleep(10);
send(sockClient,msg.lParam,strlen(msg.lParam)+1,0);
}
break;
}
}
Sleep(100);
}
closesocket(sockClient);
WSACleanup();
return 1;
}