//加载套接字库
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
浙公网安备 33010602011771号