CSocket类的使用

重点介绍一个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类。

摘自:《Visual C++ 网络编程案例实战》 清华大学出版社

原文地址:https://www.cnblogs.com/lit10050528/p/3667677.html