重点介绍一个MFC中CSocket类的使用
1、创建套接字
使用CSocket类创建套接字对象是通过该类的构造函数创建的。其原型如下:
1 CSocket::CSocket();
例如,用户创建CSocket类对象,代码如下:
1 CSocket sock;
如果用户需要创建套接字对象指针,则应该使用关键字new进行创建。代码如下:
1 CSocket *sock; 2 sock = new CSocket;
2、绑定地址信息
如果用户创建服务器套接字,那么用户应该调用该类的函数Bind()将套接字对象与服务器地址信息绑定在一起。起原型如下:
1 BOOL Bind(const SOCKADDR* lpSockAddr, int nSockAddrLen);
该函数的作用是将套接字对象与服务器地址结构绑定在一起。如果函数调用成功,则返回true;否则返回false。参数lpSockAddr指定要绑定的服务器地址结构,参数nSockAddrLen表示地址结构的长度。例如用户将上面创建的套接字对象与地址结构绑定,代码如下:
1 CSocket sock; 2 sockaddr_in addr; 3 addr.sin_family = AF_INET; 4 addr.sin_port = htons(80); 5 // 将字符串ip转换为网络字节序排列的ip 6 addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 7 sock.Bind((SOCKADDR*)&addr, sizeof(addr));
在服务器端,当地址信息绑定套接字成功后,还需要调用函数Listen()在指定端口监听客户端连接请求。函数Listen()的原型如下:
1 BOOL Listen(int nConnectionBackLog = 5);
参数nConnectionBackLog表示套接字监听客户端请求的最大数目。该参数的有效范围是1-5。默认是5,表示该套接字只能监听5个客户端所发送的连接请求。例如,套接字监听5个客户端的连接请求,代码如下:
1 sock.Listen(5);
3、连接服务器
客户端创建套接字成功以后,可以调用函数Connect()向服务器发送连接请求。函数原型如下:
1 BOOL Connect(const SOCKADDR* lpSockAddr, int nSockAddrLen);
该函数调用成功则返回true,否则,将返回false。参数lpSockAddr表示将连接的服务器地址结构。参数nSockAddrLen表示地址结构的长度大小。例如,服务器IP地址为 “127.0.0.1”,端口为80,客户端连接服务器,代码如下:
1 CSocket sock; 2 sockaddr_in addr; 3 addr.sin_family = AF_INET; 4 addr.sin_port = htons(80); 5 // 将字符串iP转换为网路字节序排列的IP 6 addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 7 sock.Connect((SOCKADDR*)&addr, sizeof(addr));
4、数据交换
无论是服务器,还是客户端都通过函数Send()和Receive()进行数据交换。函数原型如下:
1 virtural int Send(const void *lpBuf, int nBufLen, int nFlags = 0); 2 virtural int Receive(void *lpBuf, int nBufLen, int nFlags = 0);
其中,函数Send()用于发送数据缓冲区的数据,函数Receive()用于接收对方发送的数据,并将数据放在指定的缓冲区中,参数lpBuf表示数据缓冲区地址。参数nBufLen表示缓冲区的大小。参数nFlags表示数据发送或结构的标志,一般情况下,该参数设置为0,例如,使用这两个函数进行数据的发送和接收,代码如下:
1 char szBuf[] = 'a'; 2 sock.Send(szBuf, sizeof(szBuf), 0); // 发送数据缓冲区中的数据 3 sock.Receive(szBuf, sizeof(szBuf), 0); // 接收数据并存放在缓冲区中
5、关闭套接字对象
当服务器和客户端的通信完成之后,用户还必须调用函数Close()函数将套接字对象关闭。否则,程序可能在退出时发生错误,该函数原型如下:
1 virtual void Close();
例如,客户端关闭套接字对象,代码如下:
sock.Close();
套接字关闭的同时,也将服务器与客户端端之间的连接关闭了。
注意:当我们创建VC应用程序时,如果没有为应用程序指定支持Windows Socket,那么我们需要手动添加该类的头文件afxsock.h,否则,程序将不能使用CSocket类。