vc编写一个MFC应用程序,vc mfc编程实例
随着计算机网络化的深入,计算机网络编程在程序设计的过程中变得日益重要。许多文章都曾经介绍过用你呢进行插座(插座)编程的方法。但由于都是直接利用动态连接库wsock32.dll进行操作,实现比较繁琐。其实,你的MFC(消歧义)类库中提供了casyncsxmlsocket这样一个套接字类,用它来实现插座(插座)编程,是非常方便的。
客户端
创建一个对话基础项目:CSockClient .设计一对话框,增加ID_Connect(连接)#发送标识(发送)、ID_Exit(关闭)按钮,增加列表框(列表框)控件IDC_LISTMSG和编辑(编辑)控件IDC_EDITMSG,并按下表在类向导中为ccsockclienttdlg公司类添加变量。控制ID类型成员
IDC_EDITMSG放弃短信
idc _ listmsg列表框m _ msgs
在ccp米索克中添加以下代码:#包括" CSockClient.h "
#包括" csockclientdlg。h "
在迈克儿h哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈中添加以下代码:观众:
S7-1200可编程控制器:
S7-1200可编程控制器:
char m _ SZ缓冲区[4096];
在ccp米索克中重载各函数MySock:MySock()
{ m _ nlength=0
memset(m_szBuffer,0,sizeof(m _ SZ buffer));
S7-1200可编程控制器:}
麦洛克:~麦洛克()
{ //关闭套接字
if(m _ hsxmlsocket!=无效套接字)
close();}
见mysock:on receive(int nerrorcode)
{ m _ nlngth=receive(m _ SZ buffer,sizeof(m_szBuffer),0);
//下面两行代码用来获取对话框指针
ccsockclientapp * pap=(ccsockclientapp *)afx getap();
ccsockclietdlg * pdlg=(ccsockclietdlg *)pap-m _ pman内部;
pdlg-m _ msgid .InsertString(0,m _ SZ buffer);
memset(m_szBuffer,0,sizeof(m _ SZ buffer));
casyncsxmlsocket:on receive(nerrorcode);}
见mysock:on nd(int nerrorcode)
{ Send(m_szBuffer,m _ nlength,0);
S7-1200可编程控制器:
memset(m_szBuffer,0,sizeof(m _ SZ buffer));
//继续提请一个""读""的网络事件,接收服务器消息
异步选择(FD_READ):
casyncsxmlsocket:on nd(nerrorcode);}
请参阅mysock:onconnect(int nerrorcode)
{ if (nErrorCode==0)
{ m _ bconnected=true
ccsockclientapp * pap=(ccsockclientapp *)afx getap();
ccsockclietdlg * pdlg=(ccsockclietdlg *)pap-m _ pman内部;
memcpy(m_szBuffer,"连接到",13);
strncat(m_szBuffer,pdlg-m _ SZ server),
sizeof(pdlg-m _ SZ服务器));
pdlg-m _ msgid .InsertString(0,m _ SZ buffer);
异步选择(FD_READ):}//提请一个""读""的网络事件,准备接收
casyncsxmlsocket:onconnect(nerrorcode);}
建一对话框IDD_Addr,用来输入互联网协议(Internet Protocol)地址地址和连接埠;增加两个编辑(编辑)控件:idc _ addr、idc _ port按下表在类向导中为卡德德格类添加变量。控制ID类型成员
IDC _ addr cstring m _ addr(IDC _ addr CST ring m _ addr)中的变量
idc _端口Int m_Port
在csockclientdlg。ccp中添加代码:#包括AddrDlg.h
受保护:
int trycount
mysock m _ client xmlsocket
uint m _端口:
观众:
char m _服务器[256];
双击IDD _ csockclient _ dialog-IDD _ csockclient _对话方块对话框中的""连接""按钮,添加以下代码:m _ client xmlsocket .关闭(2);
m _ client xmlsocket。m _ hsxmlsocket=invalid _ socket:
m _ client xmlsocket。m _ bcconnected=false:
S7-1200可编程控制器:
S7-1200可编程控制器://默认端口1088
S7-1200可编程控制器。多摩德尔()==IDOK!-伊甸园字幕组=-翻译:IsEmpty())
{ memcpy(m _ SZ server,m_Dlg.m_Addr,sizeof(m _ SZ server));
m_szPort=m_Dlg.m_Port:
SetTimer(1,1000,null);//建立计时器,每一秒尝试连接一次
trycount=0:}
添加Windows操作系统操作系统消息WM_TIMER函数响应函数准时请参阅准时(NID事件)
{ if(m _ client xmlsocket。m _ hsxmlsocket==invalid _ socket)
{ bool bflag=m _ clientsocket .创建(0、SOCK_STREAM、FD_CONNECT):
如果(!bFlag)
{ afxmmessagebox(套接字错误!);
m _ client xmlsocket .close();
发布quiet message(0);
返回;}}
m _ client xmlsocket .连接(m _ SZ服务器、m _ SZ端口);
特里计数;
if(try count=10 m _ client xmlsocket。m _已连接)
{ kill timer(1);
if(trcount=10)
afxmmessagebox(连接失败!);
返回;}
cddialog:on mer(NID事件);}
双击IDD _ csockclient _ dialog-IDD _ csockclient _对话方块对话框中的""发送""按钮,添加以下代码:参见ccsockclietdlg:在nd()上
{ if(m _ client xmlsocket。m _已连接)
{ m _ client xmlsocket。m _ nlngth=m _ msg .内容
(m _ client xmlsocket。m _ SZ缓冲区,sizeof(m _ client xmlsocket。m _ SZ缓冲区));
m _ client xmlsocket .异步选择(FD_WRITE):
短信文件setwindowtext(“”);}}
双击IDD_CSOCKCLIENT_DIALOG对话框中的"关闭"按钮,添加以下代码:
void CCSockClientDlg:OnExit()
{ m_clientSocket .关机(2);//关闭窝
结束对话框(0);}
运行此项目,连接时输入主机名或互联网协议(互联网协议)均可,CAsyncSocket类会自动处理。
服务端
计算机网络服务器端的编程与客户端的类似,下面主要介绍他的听及接受函数。建立一个CNewSocket类,重载套接字类的收到时、发出时函数,如何进行信息的显示和发送可以参考客户程序。本例中采用将收到信息原封不动发回的方法来实现回声功能,代码如下:CNewSocket:on receive(int nErrorCOde)
{ m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0);
异步选择(FD _ WRITE);}//直接转发消息
CNewSocket:on send(int nErrorCode)
{ Send(m_szBuffer,m_nLength,0);}
建立一个CMyServerSocket类,重载套接字类的OnAccept函数代码如下:
在MyServerSocket.h中声明变量公共:
CNewSocket * m _ pSocket
void CMyServerSocket:on accept(int nErrorCode)
{ CNewSocket * p socket=new CNewSocket();
如果(接受(*pSocket))
{ p套接字-异步选择(FD _ READ);
m _ pSocket=pSocket}否则
删除pSocket}
为对话框添加一个"侦听"按钮,添加如下代码:
在CsockServerDlg.ccp中声明变量公共:
CMyServerSocket m _ srvrSocket
void CCSockServerDlg:OnListen()
{ if(m _ srvr插座。m _ h套接字==无效套接字)
{ BOOL bFlag=m_srvrSocket .创造
(UserPort,SOCK_STREAM,FD _ ACCEPT);
如果(!bFlag)
{ AfxMessageBox("套接字错误!");
M_srvrSocket .close();
PostQuitMessage(0);
返回;}}
如果(!m_srvrSocket。听着(1))
{ int nErrorCode=m_srvrSocket .GetLastError();
if (nError!=WSAEWOULDBLOCK)
{ AfxMessageBox("套接字错误!");
M_srvrSocket .close();
PostQuitMessage(0);
返回;}}}
套接字类为我们使用窝提供了极大方便。建立窝的WSAStartup过程和约束过程被简化成为创造过程,IP地址类型转换、主机名和互联网协议(互联网协议)地址转换的过程中许多复杂的变量类型都被简化成字符串和整数操作,特别是套接字类的异步特点,完全可以替代繁琐的线程操作100 .MS-VisualC++的类库(Microsoft Foundation Class的缩写)提供了大量的类库,我们若能灵活的使用他们,便会大大提高编程的效率。