【文件属性】:
文件名称:socket演示程序
文件大小:0B
文件格式:RAR
更新时间:2009-08-15 17:46:40
socket 综合系统类
过去做网络方面的东东的时候,为了试验一些SOCKET API,编写了一个演示的DEMO,可能有朋友用得到,仅在此抛砖引玉。
这个测试工程中对Socket封装的类的文件:
Soc.h
Soc.cpp
网络传输封装类
SocMesWnd
异步网络传输时,接收网络消息的窗体
该DEMO演示了以下技术:
1、CTCPServe、CTCPClient
Tcp异步传输,含TCP客户端与TCP服务端
2、CUDPSocket
Udp异步传输 & Udp组播
3、CUDPSock5
Udp Sock5传输
4、CFtp
Ftp传输
设计说明:
每个传输类都有以下两个方法
void SetSocketNotify( HWND hWndMsg, UINT unMsg ){m_hWndMsg = hWndMsg; m_nMsg = unMsg;};
void SetSocketNotify(SOCKET_NOTIFY pFuncMes){m_pFuncMes = pFuncMes;};
这两个函数用来设置发生socket事件后的外部响应方式,一种是通过窗口消息进行响应,一种是通过回调函数进行响应。这两种方式都是阻塞的。
当发生网络事件后,两种方式都会收到
WPARAM wParam, LPARAM lParam
这两个参数,其中wParam是NET_MSG枚举,表示网络事件,lParam是附加数据,由SetExtData函数预先设置好。
void SetBufferLen( int nLen );
该函数是设置当socket收到数据后,接收数据的缓冲区的大小的。当收到数据事件发生时,首先会将数据接收在缓冲区中,然后向发部发送消息或者调用回调函数,外部模块可以在响应函数中调用类的
void GetData( const BYTE ** ppucBuf, int &nLen )
来获取接收到的数据。
对于 CTCPServe这个类,有些使用上的注意点:会在收到远程连接请求后自动连接客户端,当远程连接断开时,也会自动删除连接该远程socket的子socket。CTCPServe由于每次接受连接请求后,建立了新的子socket去连接远程客户,所以它有些方法需要输入子通道的标识来完成某些功能。该标识会在接受连接请求后通过响应消息或者函数发送给外部。
比如说:
int GetRemoteIP( int nID, CString& strPeerAddress, int &nPeerPort );
这个函数用来获取远程连接的客户端的IP和端口,参数中就需要指定是哪个远程客户。
UDP传输类在接收数据的时候会将远程发送数据的主机IP和地址传送给外部。
CUDPSock5在实际使用中发现与sock5服务器的连接不是很稳定,大概是我没能很好地解析sock5协议的关系。
这个DEMO在后期添加了CFtp这个类,处理FTP下载。之所以未使用WinInet,因为它有一个MS确认的BUG:超时设置无效。这个FTP类演示了FTP协议的解析过程,完成常用的FTP功能(除FTP上传外,容我有空再做,^_^)。它也是异步的。这个类支持PORT和PASSIVE两种模式的FTP,
【文件预览】:
LX_SOC
----LX_SOC.sln(902B)
----Test()
--------FtpMesWnd.h(471B)
--------res()
--------DlgFtp.cpp(5KB)
--------Test.rc(11KB)
--------DlgSocMes.h(2KB)
--------Test.aps(36KB)
--------TestDlg.h(2KB)
--------Soc.h(16KB)
--------stdafx.h(1KB)
--------ErrorLog.h(1KB)
--------Test.h(1KB)
--------stdafx.cpp(133B)
--------Test.cpp(4KB)
--------SocMesWnd.cpp(12KB)
--------TestDlg.cpp(35KB)
--------Test.vcproj(5KB)
--------resource.h(4KB)
--------DlgFtp.h(1KB)
--------SocMesWnd.h(1KB)
--------ErrorLog.cpp(8KB)
--------FtpMesWnd.cpp(2KB)
--------Soc.cpp(69KB)