C++ 中的 Java 风格套接字编程






4.26/5 (24投票s)
一篇关于在 Windows 平台上使用纯 C++ 进行套接字编程的文章
引言
本文提供了一个 WINSOCK 函数的 C++ 封装。代码由四个类组成,它们是:CServerSocket
、CSocket
、CSocketAddress
和 CSocketException
。这些类尽可能地模仿 Java socket 类。它们旨在提供一个非常简单的 socket 接口,我相信您会发现它们在某种程度上很有用。
Using the Code
使用 socket 类的第一步是初始化 Windows socket 库。这可以通过调用 CWinSock
类的 Initialize()
静态函数来完成。在使用 socket 类之后,必须通过调用 CWinSock
类的 Finalize()
静态函数来卸载该库。
CWinSock::Initialize();
// socket calls
CWinSock::Finalize();
要创建一个服务器,声明一个 CServerSocket
对象并调用它的 Accept()
函数。CServerSocket
有三个构造函数。默认构造函数不带任何参数,并将服务器初始化为侦听端口 80。服务器还有一个队列大小,即在内部队列中等待处理的连接数。这默认为 10。另一个构造函数将端口号作为参数。还有一个构造函数接收端口号和队列大小作为参数。
Accept()
函数返回一个指向 CSocket
的指针。应用程序可以使用此指针与客户端通信。使用 Read()
和 Send()
函数进行此操作。Read()
接受两个参数:一个指向字符缓冲区的指针和一个指定要读取的字节数的整数。初始化此缓冲区是调用者的责任。Send()
接受一个指向字符缓冲区的指针作为其参数。这是要写入网络的数据。在所有读取和写入结束后,删除 CSocket
对象是调用者的责任。以下代码片段说明了一个接受单个连接的简单服务器。
// headers required by socket classes in sock.h
#include < string>
#include < vector>
using namespace std;
#include < windows.h>
#include "sock.h"
using namespace openutils;
int main()
{
CServerSocket server(100); // server listening on port 100
CSocket* client = server.Accept(); // accepting a client
char *buffer = new char[100];
client->Read(buffer,99);
// reads some data from client
// client-> sends it back to the client
delete client; // deletes the client socketr
delete[] buffer;
server.Close(); // closes the server
}
在实际项目中,Accept()
应该放在一个单独的线程中,并且每个新的客户端 socket 应该由一个新的线程处理。有关在 C++ 中创建线程的更多详细信息,请参阅我在 CodeProject.com 上的文章 C++ 中的同步多线程 (No MFC!)。要创建客户端 socket,请调用 CSocket
类的 Connect()
函数。这是一个简短的例子
CSocket client;
client.Connect("http://www.yahoo.com",80);
client.Send("GET / HTTP 1.1 \r\n");
client.Read(buffer,(BUFF_SZ-1));
printf("\n%s",buffer);
client.Close();
当然,上面的代码没有发送有效的 HTTP 请求,但它演示了如何使用 CSocket
对象连接到正在运行的服务器并与之通信。还有一个名为 CSocketAddress
的实用程序类。CSocket
类有一个嵌入的 CSocketAddress
对象。您可以通过调用 CSocket
的 GetAddress()
函数来获得指向此对象的指针。使用此指针,您可以检索有关 CSocket
连接到的服务器的有用信息,例如其 DSN、别名(如果有)、IP 地址等。另请记住,所有 socket 代码都应包含在处理 CSocketExceptions
的 try-catch 块中
try
{
// socket calls
}
catch(CSocketException ex)
{
printf("\nError: %d,%s",ex.GetCode(),ex.GetMessage());
}
历史
- 创建时间:2004 年 7 月 8 日
- 更新时间:2007 年 11 月 15 日