Visual C++的MFC提供了CSocket类用来实现网络通信。
下面介绍VC++在Windows 95中实现Socket的 CSocket
类相关成员函数(这些成员函数实际上是从CAsyncSocket 类继承来的)的使用。
(1) BOOL
Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, long lEvent =
FD_READ |FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT| FD_CLOSE,LPCTSTR
lpszSocketAddress = NULL )
该函数用来建立Socket。 其中,nSocketPort
为所选择的Socket 端口,一般要大于 1023, 如果该参数为0,则由系统选定一端口,默认值为0 ;nSocketType
为套接字类型:SOCK_STREAM 表示为流套接字,SOCK_DGRAM 表示为数据报套接字,默认值为SOCK_STREAM ;lEvent
标识该Socket 要完成哪种工作,默认值为FD_READ|FD_WRITE|FD_OOB| FD_ACCEPT|FD_CONNECT|FD_CLOSE
;lpszSockAddress 为网络地址信息结构指针,包含网络地址, 默认值为NULL
。
(2)BOOL Bind( UINT nSocketPort, LPCTSTR
lpszSocketAddress = NULL )
该函数的作用是将Socket
端口与网络地址连接起来。参数含义同上 。
(3)BOOL Listen( int
nConnectionBacklog = 5
)
该函数的作用是等待Socket请求。其中,nConnec-tionBacklog
表示等待队列的长度,默认值为最大值5 。
(4)virtual BOOL Accept(
CAsyncSocket& rConnectedSocket, SOCKADDR* lpSockAddr = NULL, int* lpSockAddrLen
= NULL
)
该函数的作用是取得队列上第一个连接请求并建立一个具有与Socket相同特性的套接字。其中,rConnectedSocket
表示一个新的Socket 。
(5)BOOL Connect( LPCTSTR
lpszHostAddress, UINT nHostPort
)
该函数的作用是提出请求。其中,lpszHostAddress 和 nHostPort
为接受请求进程的网络地址和Socket 端口号。
(6)virtual void Close(
)
该函数的作用是关闭该Socket
。
利用CSocket类直接进行数据通信有两种方式:一种是利用CSocketFile 类和Archive
类去实现,另一种是利用CSocket的成员函数 Receive、Send、ReceiveFrom、SendTo、Listen 和 Accept
等来实现(这些成员函数实际上也是从CAsyncSocket 类继承的)。
两种方法的实现步骤如下
:
Server : Construct-> Creat-> Bind ->
Listen-> Accept-> Send->Close ;
Cilent :
Construct ->Creat-> Connect-> Receive->
Close。
下面就用VC++的代码分别介绍如何运用上述两种方法来实现Socket
编程。
1、 利用CSocketFile类和Archive
类实现
(1)服务器程序流程
//
创建一个套接字对象
CSocket
sockSrvr;
//为上述套接字对象创建一个套接字
sockSrvr.Create(nPort);
//开始侦听
sockSrvr.Listen(
);
//创建一个新的套接字对象
CSocket
sockRecv;
//接受连接
sockSrvr.Accept(
sockRecv );
// 创建文件对象
CSocketFile
file(&sockRecv);
//创建一个archive对象
CArchive
arIn(&file, CArchive::load);
/*or*/_CArchive
arOut(&file,
CArchive::store);
//使用archive对象传输数据
arIn
>> dwValue;
/*or*/ arOut < <
dwValue;
(2)客户端程序流程
//创建一个套接字对象
CSocket
sockClient;
//为这个对象创建一个套接字
sockClient.Create(
);
//寻找一个连接
sockClient.Connect(strAddr,
nPort);
//创建一个文件对象
CSocketFile
file(&sockClient);
//创建一个archive对象
CArchive
arIn(&file, CArchive::load);
/*or*/_CArchive
arOut(&file,
CArchive::store);
//使用这个对象传输数据
arOut
< < dwValue;
/*or*/ arIn >>
dwValue;
上述程序中, nPort 是Socket 的端口号,strAddr
是该机器的IP地址(如202.197.1.3 或 FTP://RedAlert.com等),这两个变量在Server和Client中要一致。当Server进程运行至Listen
后便处于睡眠状态直到Client进程执行Connect
时才被唤醒,而后两个进程便开始传输数据了。
2、利用CSocket的成员函数实现
(1)服务器流程
//套接字初始化
if(!AfxSocketInit()){
MessageBox("WindowsSocket initial
failed!","Send",MB_ICONSTOP);
Return;
}
//
创建两个套接字对象
CSocket
ChatSend,server;
//
创建一个套接字
if(!ChatSend.Create(nPort)) //
nPort=1025
MessageBox("SendSocket create failed!",
"Send",MB_ICONSTOP);
else{
//
把本地地址给套接字
ChatSend.Bind(nProt,strAddr);
//
strAddr="202.196.111.1"
// 开始侦听
ChatSend.Listen();
//
创建一个新的套接字并和他相连
ChatSend.Accept(Server);
}
//发送一个CString
对象
Server.SendTo(csSendText,csCounts,nPort,strAddr);
//
关闭这两个套接字
Server.Close();
ChatSend.Close();
(2)客户端程序流程
//
套接字初始化
if(!AfxSocketInit()){
MessageBox("WindowsSocket initial failed!",
"Receive",MB_ICONSTOP);
return;
}
//
创建一个套接字对象
CSocket ChatRecieve;
//
创建一个套接字
if(!ChatReceive.Create()){
MessageBox("ReceiveSocket create
failed!","Receive",MB_ICONSTOP);
return;
}
else{
// 创建一个对等套接字
ChatReceive.Connect(strAddr,nPort);
}
//接受一个CString
对象
ChatReceive.ReceiveFrom(csReceiveText,csCounts,strAddr,nPort);
//
关闭套接字
ChatReceive.Close();
上述两个进程完成的工作是:由Server
进程发送一字符串,Client 进程接收。 strAddr 和 nPort 的含义与方法1 中的相同 ;csSendText 和 csReceiveText
为发送与接收的字符串;csCounts为字串长度,这一长度在两个进程中要求接收长度小于或等于发送长度,否则会导致数据传输错误。另外,在程序中要加入头文件afxsock.h,
CSocket 类的有关说明均在afxsock.h 中。
方法1 适合于对多个不同类型数据的通信,方法2 适合于对字符串的通信,具体选用何种方法则取决于具体应用的需求。
转载自:MFC网络编程学习
CSocket类网络编程 MFC,布布扣,bubuko.com
原文:http://www.cnblogs.com/lit10050528/p/3662952.html