//加载套接字库

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;
}
}

//初始化套接字

#define UM_SOCK WM_USER+1001//自定义消息

afx_msg LRESULT OnSock(WPARAM wParam,LPARAM lParam);

ON_MESSAGE(UM_SOCK, OnSock)

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));



//======WSAAsyncSelect 模型===
if (SOCKET_ERROR == WSAAsyncSelect(m_Socket, m_hWnd, UM_SOCK, FD_ACCEPT))
{
 MessageBox(_T("注册网络读取时间失败!"));
 return FALSE;
}

return TRUE;
}

//消息响应

LRESULT DLG::OnSock(WPARAM wParam, LPARAM lParam)
{
SOCKET socket = (SOCKET)wParam;
switch (WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT://有网络连接到达
{
SOCKET AcpSock = accept(m_Socket, NULL, NULL);
if (AcpSock == INVALID_SOCKET)
{
closesocket(m_Socket);
return 0;
}
WSAAsyncSelect(AcpSock, m_hWnd, UM_SOCK, FD_READ | FD_WRITE | FD_CLOSE);
}
break;
case FD_READ://缓冲区有数据待接收时进入
{
MSGINFO mSgInfo = { 0 };
memset(mSgInfo.strMsg, 0, sizeof(mSgInfo.strMsg));
int nRecvSize = recv(socket, (char*)&mSgInfo, sizeof(MSGINFO), 0);
char* str = mSgInfo.strMsg;
//char buf[6];
//int nRecvSize = recv(socket, buf, 6, 0);
if(nRecvSize == 0)
{
closesocket(socket);
break;
}
else if (SOCKET_ERROR == nRecvSize)
{
break;
}
else
{
if (strcmp(/*buf*/mSgInfo.strMsg, "START") == 0)
{
m_bGrabStarting = FALSE;
OnBnClickedBtnStartgrab();
}
int res = send(socket, _T("p"), 1, 0);
if (SOCKET_ERROR == res)
{
break;
}
}
}
break;
case FD_WRITE://新连接到达时进入;缓冲区满数据未发送完全时进入
{
int ress = send(socket, _T("P"), 1, 0);
if (ress == SOCKET_ERROR)
{
break;
}
}
break;
case FD_CLOSE://客户端关闭连接时进入
closesocket(socket);
break;
}
}

 

参考网址:https://www.cnblogs.com/hgwang/p/6093976.html

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