65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.26/5 (24投票s)

2004 年 7 月 12 日

BSD

2分钟阅读

viewsIcon

180782

downloadIcon

3563

一篇关于在 Windows 平台上使用纯 C++ 进行套接字编程的文章

引言

本文提供了一个 WINSOCK 函数的 C++ 封装。代码由四个类组成,它们是:CServerSocketCSocketCSocketAddressCSocketException。这些类尽可能地模仿 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 对象。您可以通过调用 CSocketGetAddress() 函数来获得指向此对象的指针。使用此指针,您可以检索有关 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 日
© . All rights reserved.