//加载套接字库

void LoadSocket()

{

//加载套接字
WORD wVersionRequested;
WSADATA wasData;
int err;

wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wasData);
if(err != 0)
return;

if(LOBYTE(wasData.wVersion) != 2 || HIBYTE(wasData.wVersion) != 2)
{
WSACleanup();
return;
}
}

DWORD WINAPI AccpSockProc(LPVOID lpParameter)//定义线程函数

//初始化套接字

BOOL CHigDefArryDlg::OnInitSocket()
{
m_Socket = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
if (INVALID_SOCKET == m_Socket)
{
MessageBox(_T("创建套接字失败!"));
return FALSE;
}
SOCKADDR_IN addrSock;
addrSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSock.sin_family = AF_INET;
addrSock.sin_port = htons(6000);

if (SOCKET_ERROR == bind(m_Socket, (SOCKADDR*)&addrSock, sizeof(SOCKADDR)))
{
MessageBox(_T("绑定失败!"));
return FALSE;
}
if (SOCKET_ERROR == listen(m_Socket, 5))
{
MessageBox(_T("监听套接字失败!"));
return FALSE;
}
MSGINFO mSgInfo;
memset(&mSgInfo, 0, sizeof(MSGINFO));


//--------事件选择(WSAEventSelect)模型-----
if (NULL == m_AccpHanTh)
{
DWORD threadId;
m_AccpHanTh = CreateThread(NULL, 0, AccpSockProc, this, 0,&threadId);
}
return TRUE;
}

SOCKET socketArrary[WSA_MAXIMUM_WAIT_EVENTS];// 定义全局socket数组
WSAEVENT eventArrary[WSA_MAXIMUM_WAIT_EVENTS];//定义全局event数组;一个sock关联一个event
DWORD dwTotal = 0;//记录接入的sockt数量
DWORD WINAPI AccpSockProc(LPVOID lpParameter)
{
CHigDefArryDlg* pDlg = (CHigDefArryDlg*)lpParameter;
ASSERT(pDlg != NULL);

SOCKET acceptSocket = INVALID_SOCKET;
//SOCKET listenSocket = INVALID_SOCKET;

WSAEVENT newEvent;
WSANETWORKEVENTS NetworkEvents;
DWORD Index;
char buf[6] = { 0 };
//CString cstrMsg;

newEvent = WSACreateEvent();
WSAEventSelect(pDlg->m_Socket, newEvent, FD_ACCEPT | FD_CLOSE);
socketArrary[dwTotal] = pDlg->m_Socket;
eventArrary[dwTotal] = newEvent;
dwTotal++;

//int nRecvSize = 0;
//char temgstr[6];
while (TRUE)
{
if (WaitForSingleObject(pDlg->m_hExit, 10) != WAIT_TIMEOUT)
break;

Index = WSAWaitForMultipleEvents(dwTotal, eventArrary, FALSE, 1000, FALSE);
if (WSA_WAIT_TIMEOUT == Index)
{
continue;
}
WSAEnumNetworkEvents(socketArrary[Index - WSA_WAIT_EVENT_0], eventArrary[Index - WSA_WAIT_EVENT_0], &NetworkEvents);
WSAResetEvent(eventArrary[Index - WSA_WAIT_EVENT_0]);

if (NetworkEvents.lNetworkEvents & FD_ACCEPT)
{
if (NetworkEvents.iErrorCode[FD_ACCEPT_BIT] != 0)
continue;
if (dwTotal > WSA_MAXIMUM_WAIT_EVENTS)//客户端超过最大连接数
continue;
acceptSocket = accept(socketArrary[Index - WSA_WAIT_EVENT_0], NULL, 0);
WSAResetEvent(eventArrary[Index - WSA_WAIT_EVENT_0]);
newEvent = WSACreateEvent();
WSAEventSelect(acceptSocket, newEvent, FD_READ | FD_WRITE | FD_CLOSE);
socketArrary[dwTotal] = acceptSocket;
eventArrary[dwTotal] = newEvent;
dwTotal++;
}

if (NetworkEvents.lNetworkEvents & FD_READ)
{
if (NetworkEvents.iErrorCode[FD_READ_BIT] != 0)
continue;
recv(socketArrary[Index - WSA_WAIT_EVENT_0],(char*)buf,6,0);
WSAResetEvent(eventArrary[Index - WSA_WAIT_EVENT_0]);
if (strcmp(buf, "START") == 0)
pDlg->OnBnClickedBtnStartgrab();
//cstrMsg = buf;
}

if (NetworkEvents.lNetworkEvents&FD_WRITE)
{
if (NetworkEvents.iErrorCode[FD_WRITE_BIT] != 0)
continue;
}

if (NetworkEvents.lNetworkEvents &FD_CLOSE)
{
if (NetworkEvents.iErrorCode[FD_CLOSE_BIT] != 0)
continue;
closesocket(socketArrary[Index - WSA_WAIT_EVENT_0]);
WSACloseEvent(eventArrary[Index - WSA_WAIT_EVENT_0]);
for (int i = Index-WSA_WAIT_EVENT_0; i < dwTotal; i++)
{
socketArrary[i] = socketArrary[i + 1];
eventArrary[i] = eventArrary[i + 1];
}
dwTotal--;
}
}
return TRUE;
}

 

参考网址:https://blog.csdn.net/mldxs/article/details/12587909

posted on 2019-11-12 17:09  ~纸鸢~  阅读(68)  评论(0)    收藏  举报