socket用c语言编写案例,一个使用CSocket类的网络通信实例 淩亂°似流年 2022-10-15 00:38 146阅读 0赞 3.8一个使用CSocket类的网络通信实例 本例采用CSocket编程模型建立一个聊天程序的简单实例。建立项目时注意选上“Windows套接字”复选框。 3.8.1服务器端应用程序设计(ServerDemo) 1)界面 ![e6e870c549359d7ed48a6c789b4a9125.png][] 各控件属性如下 控件类型 控件ID Caption属性 控件变量 变量类型 列表框 IDC\_Log 无 m\_LogCtrl CListBox 编辑框 IDC\_Message 无 m\_MsgCtrl CEdit 按钮 IDC\_Send 发送 M\_SendCtrl CButton 静态控件 IDC\_STATIC 记录 无 无 静态控件 IDC\_STATIC 待发消息 无 无 列表框控件IDC\_Log属性“sort”值为false,属性“Horizontal Scroll”值为true。 按钮IDC\_Send属性Disable值为true。 2)定义CSocket类的派生类CServSocket和CRecvSocket。 从CSocket编程模型知道,服务器端需要两种套接字,一个用来侦听连接请求,一个用来与请求连接的套接字建立连接。因此,为程序添加两个CSocket派生类:SServSocket和CRecvSocket,它们与对话框类密切配合,共同完成程序所要求实现的功能。 3)建立套接字与对话框类的关联 在程序中,对话框类要用到套接字类,而套接字类在响应某些消息,如在函数OnAccept、OnReceive中进行处理时,也要改变对话框的某些控件状态,以反映给用户这些事情的发生。 这里存在着两个类相互使用的情况,把套接字类对象定义成对话框类的成员变量,同时在套接字类中也把对话框类定义为成员变量。如何实现这样的用法呢?在对话框类头文件中加入套接字头文件的声明,然后在套接字类头文件中加入对话框类头文件的声明,这样的做法显然行不通。 具体做法应该如下: 首先,在ServerDemoDlg.h中加入套接字类头文件的声明,语句\#pragmaonce的后面加入如下语句: \#include"ServSocket.h" \#include"RecvSocket.h" 然后在该文件中为CServerDemoDlg类增加两个公有成员变量,语句如下: CServSocket \*ServSock; CRecvSocket \*RecvSock; 这样在对话框类中就可以使用套接字类了。 继续在套接字类中加入对话框类信息。 首先,在ServSocket.h文件的开头,语句\#pragma once的后面加入如下语句: classCServerDemoDlg; 然后,在该文件中为CServSocket类添加一个公有成员变量和一个构造函数: CServSocket(CServerDemoDlg \*Dlg); CServerDemoDlg \*m\_Dlg; 接着在ServSocket.cpp文件中添加新的构造函数的实现,并添加一条关于ServerDemoDlg.h文件的预编译声明,代码如下: \#include “ServerDemoDlg.h” CServSocket::CServSocket(CServerDemoDlg \*Dlg) \{ m\_Dlg=Dlg; \} 这样,在套接字类中也可以通过成员变量使用对话框了。 使用同样的方法对CRecvSocket类进行设置,使其也可以通过成员变量使用对话框。 4)为套接字添加串行化读写信息的功能。在服务器端的两个套接字中,只有CRecvSocket套接字是真正与客户端套接字建立连接,发送与接收数据的,因此,我们只为该类添加串行化读写信息功能。在RecvSocket.h文件中为类CRecvSocket添加三个公有成员变量。 CSocketFile \*m\_File; CArchive \*m\_ArIn; CArchive \*m\_ArOut; 5)在对话框中初始化套接字并侦听连接请求。在OnInitDialog函数中添加如下代码: // TODO:在此添加额外的初始化代码 if(ServSock=new CServSocket(this)) \{ if(ServSock->Create (9547)) \{ m\_LogCtrl.AddString ("等待连接......"); ServSock->Listen (); \} else \{ m\_LogCtrl.AddString ("初始化失败,请重新启动程序!"); delete ServSock; \} \} else \{ m\_LogCtrl.AddString ("初始化失败,请重新启动程序!"); \} 上述代码主要是创建并初始化ServSock套接字,并开始侦听连接请求。 6)接受连接请求。由于是CServSocket类的ServSock对象在侦听连接请求,因此由该类来接受连接请求。 首先,在ServSocket.h文件中加入如下语句: \#iinclude “RecvSocket.h” 然后,重载该类的OnAccept函数,在该函数中添加如下代码: CRecvSocket \*tempSock; if(tempSock=new CRecvSocket(this->m\_Dlg )) \{ if(Accept(\*tempSock)) \{ tempSock->m\_File =new CSocketFile(tempSock); tempSock->m\_ArIn =new CArchive(tempSock->m\_File ,CArchive::load ); tempSock->m\_ArOut =new CArchive(tempSock->m\_File ,CArchive::store ); m\_Dlg->RecvSock =tempSock; tempSock=NULL; m\_Dlg->m\_LogCtrl .AddString ("连接成功,可以开始传递消息"); m\_Dlg->m\_SendCtrl.EnableWindow (true); \} else \{ m\_Dlg->m\_LogCtrl .AddString ("客户端当前的连接尝试失败"); delete tempSock; \} \} else \{ m\_Dlg->m\_LogCtrl .AddString ("连接套接字初始化失败"); \} 上述代码首先调用Accept函数接受连接请求,然后为该连接创建一个CRecvSocket类型的套接字,并为该套接字关联CArchive对象,使其能实现串行化传输信息的功能。最后把关联好的套接字传回给对话框对象供其使用。这样,对话框对象的成员变量RecvSock套接字便与客户端套接字之间建立了一条信息通道,信息将在两个套接字之间传递。 7)接收信息,连接建立成功后,当有信息到达服务器端时,就会引发RecvSock套接字对象的OnReceive函数,因此需要重载CRecvSocket类的OnReceive函数。添加代码如下: CString str; (\*m\_ArIn)>>str; m\_Dlg->m\_LogCtrl .AddString ("对方发来的信息如下:"); m\_Dlg->m\_LogCtrl .AddString (str); m\_Dlg->m\_LogCtrl .SetCurSel (m\_Dlg->m\_LogCtrl .GetCount() - 1); 8)发送信息。为对话框“发送”按钮添加事件处理函数OnBnClickedSend(),代码如下: voidCServerDemoDlg::OnBnClickedSend() \{ // TODO:在此添加控件通知处理程序代码 CString str; m\_MsgCtrl.GetWindowText (str); if(str.GetLength ()==0) AfxMessageBox("空信息,所以不发出"); else \{ m\_LogCtrl.AddString ("你发出的信息如下:"); m\_LogCtrl.AddString (str); m\_LogCtrl.SetCurSel (m\_LogCtrl.GetCount ()-1); \*(RecvSock->m\_ArOut )< RecvSock->m\_ArOut ->Flush (); \} \} 3.8.2客户端应用程序设计(项目名称ClientDemo) 1)界面 各控件属性如下 控件类型 控件ID Caption属性 控件变量 变量类型 列表框 IDC\_Log 无 m\_LogCtrl CListBox 编辑框 IDC\_Message 无 m\_MsgCtrl CEdit 按钮 IDC\_Send 发送 M\_SendCtrl CButton 静态控件 IDC\_STATIC 记录 无 无 静态控件 IDC\_STATIC 待发消息 无 无 列表框控件IDC\_Log属性“sort”值为false,属性“Horizontal Scroll”值为true。 按钮IDC\_Send属性Disable值为true。 2)创建套接字类(从CSocket类派生)。客户端只需要一个套接字,命名为CClientSocket。 3)建立对话框类与套接字类的关联。 首先,在ClientDemoDlg.h文件的开头,语句\#pragma once后面加入如下语句: \#include “ClientSocket.h” 然后,在该文件中为CClientDemoDlg类添加一个公有成员变量,语句如下: CClientSocket \*ClientSock; 接着,在ClientSocket.h文件的开头,语句\#pragma once后面加入如下语句: class CClientDemoDlg; 然后,在该文件中为CClientSocket类添加一公有成员变量和一个构造函数,语句如下: CClientSocket(CClientDemoDlg \*Dlg); CClientDemoDlg \*m\_Dlg; 接着,在ClientSocket.cpp文件中添加新的构造函数的实现代码,并添加一条关于CClientDemoDlg.h文件的预编译声明,代码如下: \#include"ClientDemoDlg.h" CClientSocket::CClientSocket(CClientDemoDlg \*Dlg) \{ m\_Dlg=Dlg; \} 这样,便完成了对话框和套接字之间的连接了。 4)为套接字添加串行化读写信息的功能。在ClientSocket.h文件中,为类CClientSocket添加三个公有成员变量,代码如下: CSocketFile \*m\_File; CArchive \*m\_ArIn; CArchive \*m\_ArOut; 5)在对话框中初始化套接字并建立连接 在对话框类的OnInitDialog函数中添加如下代码 // TODO:在此添加额外的初始化代码 m\_LogCtrl.AddString ("正在连接......"); if(ClientSock=new CClientSocket(this)) \{ if(ClientSock->Create()) \{ if(ClientSock->Connect ("localhost",9547)) \{ ClientSock->m\_File =new CSocketFile(ClientSock); ClientSock->m\_ArIn =new CArchive(ClientSock->m\_File ,CArchive::load ); ClientSock->m\_ArOut =new CArchive(ClientSock->m\_File,CArchive::store ); m\_LogCtrl.AddString ("连接成功,可以开始传递消息"); m\_SendCtrl.EnableWindow (true); \} else \{ m\_LogCtrl.AddString ("连接不成功"); delete ClientSock; \} \} else \{ m\_LogCtrl.AddString ("初始化失败,请重新启动程序"); delete ClientSock; \} \} else \{ m\_LogCtrl.AddString ("初始化失败,请重新启动程序"); \} 6)接收消息。消息到来时,会引发套接字的OnReceive消息,因此要重载CClientSocket类的OnReceive函数,在其中添加代码如下 // TODO:在此添加专用代码和/或调用基类 CString str; m\_Dlg->m\_LogCtrl .AddString ("对方发来消息如下:"); \*m\_ArIn>>str; m\_Dlg->m\_LogCtrl .AddString (str); m\_Dlg->m\_LogCtrl .SetCurSel (m\_Dlg->m\_LogCtrl .GetCount ()-1); 7)发送信息。为对话框“发送”按钮添加事件处理函数OnBnClickedSend(),代码如下: voidCClientDemoDlg::OnBnClickedSend() \{ // TODO:在此添加控件通知处理程序代码 CString str; m\_MsgCtrl.GetWindowText (str); if(str.GetLength ()==0) AfxMessageBox("空信息,所以不发出"); else \{ m\_LogCtrl.AddString ("你发的信息如下:"); m\_LogCtrl.AddString (str); m\_LogCtrl.SetCurSel (m\_LogCtrl.GetCount ()-1); \*(ClientSock->m\_ArOut )< ClientSock->m\_ArOut ->Flush (); \} \} [e6e870c549359d7ed48a6c789b4a9125.png]: /images/20221014/00c3f88e0aaf414baebd0efe765e1ed5.png
相关 Java网络编程:Socket通信案例分析 Java网络编程中的Socket通信是一种基于TCP/IP协议的双向通信方式。下面我们将通过一个简单的案例,来剖析Socket通信的具体操作和流程。 **案例:客户端向服务器 深碍√TFBOYSˉ_/ 2024年09月18日 14:36/ 0 赞/ 10 阅读
相关 网络编程问题:Java socket通信案例 Java Socket通信是一种基于TCP/IP协议的双向数据传输方式。以下是一个简单的Socket通信案例: 1. 创建Server端: ```java import ja 傷城~/ 2024年09月18日 13:03/ 0 赞/ 4 阅读
相关 Java网络编程:Socket通信案例分析 在Java中,Socket是一种用于在客户端和服务器之间建立双向通信的API。下面将通过一个简单的Socket通信案例进行分析。 1. **创建Socket对象**: 痛定思痛。/ 2024年09月16日 23:39/ 0 赞/ 15 阅读
相关 使用Java编写的网络通信问题案例集 编写一个网络通信问题案例集,涉及到Java的网络编程、TCP/UDP协议、Socket操作等内容。下面是一个简单的示例集: 1. **基本网络连接**: - 案例:创建 电玩女神/ 2024年09月16日 00:03/ 0 赞/ 5 阅读
相关 使用Java编写的网络通信问题案例分析 在网络通信问题中,我们通常会用到Java的Socket编程。以下是一个基于Java的简单网络聊天应用案例分析: 1. **需求定义**:用户可以输入文字发送给服务器端,服务器 一时失言乱红尘/ 2024年09月10日 19:33/ 0 赞/ 13 阅读
相关 C++网络通信 Socket 目录 服务端: 客户端: 客户端第二种写法:不使用inet\_pton函数 -------------------- 服务端: \include <iostre 妖狐艹你老母/ 2022年11月28日 13:26/ 0 赞/ 97 阅读
相关 socket用c语言编写案例,一个使用CSocket类的网络通信实例 3.8一个使用CSocket类的网络通信实例 本例采用CSocket编程模型建立一个聊天程序的简单实例。建立项目时注意选上“Windows套接字”复选框。 3.8.1服务器 淩亂°似流年/ 2022年10月15日 00:38/ 0 赞/ 147 阅读
相关 使用C++封装一个socket通信框架 封装一组socket常用通信操作,header only 风格。 pragma once include <unistd.h> includ 电玩女神/ 2022年01月05日 06:27/ 0 赞/ 531 阅读
相关 【计算机网络 16】一个基于TCP协议的Socket通信实例 一、前言 一般接口对接多以http/https或webservice的方式,socket方式的对接比较少并且会有一些难度。正好前段时间完成了一个socket的接口的对接需 旧城等待,/ 2021年09月07日 06:16/ 0 赞/ 312 阅读
还没有评论,来说两句吧...