1、首先定义变量
public:
void StartListen();
void StopListen();
void ReceiveSendData();
void CloseSock();
void HandleData();
SOCKET m_server;
SOCKET m_listen;//监听
2、编写监听函数
void StartListen()
{
//加载协议,使用winsock2.2版
WSADATA wsd;
WSAStartup(MAKEWORD(2,2),&wsd);
//创建流式套接字
m_listen=socket(AF_INET,SOCK_STREAM,0);
//将网络中的事件关联到窗口的消息函数中,定义消息为20000,检测客户端的连接请求
WSAAsyncSelect(m_listen,m_hWnd,20000,FD_ACCEPT);
CString sIP="192.168.255.2";
CString sPort="30003";
//服务器地址
sockaddr_in serveraddr;
serveraddr.sin_family=AF_INET;
serveraddr.sin_addr.S_un.S_addr = inet_addr(sIP);
serveraddr.sin_port=htons(atoi(sPort));
//绑定地址
if(bind(m_listen,(sockaddr*)&serveraddr,sizeof(serveraddr)))
{
MessageBox("绑定地址失败");
return;
}
//监听开始,服务器等待连接请求到来
listen(m_listen,5);
m_ListWords.AddString("监听开始");
m_ListWords.AddString("地址"+sIP+"端口"+sPort);
m_ListWords.AddString("等待客户连接");
}
3、监听消息事件
BOOL PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
CWnd *pWnd = NULL;
int nID = 0; //< 保存获取的控件ID
GX_STATUS status = GX_STATUS_SUCCESS;
//判断是否是键盘回车消息
if (WM_KEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam)
{
//获取当前拥有输入焦点的窗口(控件)指针
pWnd = GetFocus();
//获取焦点所处位置的控件ID
nID = pWnd->GetDlgCtrlID();
//判断控件ID类型
switch (nID)
{
//如果是曝光EDIT框的ID,设置曝光时间
case IDC_EDIT_SHUTTER:
//如果是增益EDIT框的ID,设置增益值
case IDC_EDIT_GAIN:
//失去焦点
SetFocus();
break;
default:
break;
}
return TRUE;
}
if ((WM_KEYDOWN == pMsg->message) && (VK_ESCAPE == pMsg->wParam))
{
return TRUE;
}
//添加的网络通信的消息事件
if (pMsg->message==20000)
{
this->HandleData();
}
if(pMsg->message==30000)
{
switch(pMsg->lParam)
{
case FD_READ:
this->ReceiveSendData();
break;
case FD_CLOSE:
this->CloseSock();
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
4、编写处理数据函数,接受客户端连接请求
void HandleData()
{
sockaddr_in serveraddr;
int len=sizeof(serveraddr);
//接收客户请求
m_server=accept(m_listen,(sockaddr*)&serveraddr,&len);
//利用新创建的通信套接字检测客户端是否发来数据或者主动断开连接的事件
WSAAsyncSelect(m_server,m_hWnd,30000,FD_READ|FD_CLOSE);
m_ListWords.AddString("接受了一个客户端的连接请求");
//界面完善
}
5、成功接受客户端连接后,开始读取并显示接受数据
void ReceiveSendData()
{
//接收客户端发来的内容,保存在字符数组receiveBuffer中
int socklenServer=sizeof(serveraddr);
int n=recv(m_server,receiveBuffer,sizeof(receiveBuffer),0);
//对接收到的命令进行解析
receiveBuffer[n] = '\0';
if(n>0)
{
CString sTemp;
sTemp.Format("收到:%s",receiveBuffer);
//WSAAsyncSelect(m_client,m_hWnd,30000,FD_READ|FD_CLOSE);
m_ListWords.AddString(sTemp);
m_ListWords.SetTopIndex(m_ListWords.GetCount()-1);
}
//继续侦测服务器的动向
WSAAsyncSelect(m_server,m_hWnd,30000,FD_READ|FD_CLOSE);
}
6、关闭socket
void CGxSingleCamMonoDlg::CloseSock()
{
m_ListWords.AddString("客户端断开连接");
//关闭与客户端通信的socket
closesocket(m_server);
//准备接收新的客户端连接
WSAAsyncSelect(m_listen,m_hWnd,20000,FD_ACCEPT);
}
7、停止监听函数
void StopListen()
{
closesocket(m_listen);
m_ListWords.AddString("停止监听");
}
8、程序测试
Finish!