21xrx.com
2024-11-22 12:16:54 Friday
登录
文章检索 我的文章 写文章
C++ TCP/IP编程
2023-06-27 10:51:16 深夜i     --     --
C++ TCP/IP 编程

C++是一种高级程序设计语言,它的优点之一是可以进行TCP/IP编程。本文将探讨C++ TCP/IP编程的相关知识和技术。

TCP/IP编程是指使用TCP/IP协议栈提供的应用程序接口(API)来编写网络应用程序。TCP/IP协议栈是Internet的基础,它包含了多个协议,如TCP、UDP、IP等。C++ TCP/IP编程通常使用套接字(Socket)作为API,套接字是一种用于网络通信的编程接口。套接字可以在应用程序之间建立连接,并通过连接进行数据传输。

C++提供了标准库的网络编程接口,其中包括了套接字类。通过使用这些类,可以简化C++ TCP/IP编程的过程。下面是一个简单的C++ TCP/IP编程示例,该示例使用套接字类实现了一个基本的客户端-服务器通信程序:

服务器端:


#include <iostream>

#include <string>

#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

using namespace std;

int main()

{

  // 初始化Winsock

  WSADATA wsaData;

  WORD wVersion = MAKEWORD(2, 2);

  int ret = WSAStartup(wVersion, &wsaData);

  if (ret != 0)

  

    cout << "WSAStartup failed with error " << ret << endl;

    return 1;

  

  // 创建套接字

  SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

  if (listenSocket == INVALID_SOCKET)

  {

    cout << "socket failed with error " << WSAGetLastError() << endl;

    WSACleanup();

    return 1;

  }

  // 绑定套接字

  sockaddr_in serverAddr;

  serverAddr.sin_family = AF_INET;

  serverAddr.sin_addr.s_addr = INADDR_ANY;

  serverAddr.sin_port = htons(1234);

  ret = bind(listenSocket, (sockaddr*)&serverAddr, sizeof(serverAddr));

  if (ret == SOCKET_ERROR)

  {

    cout << "bind failed with error " << WSAGetLastError() << endl;

    closesocket(listenSocket);

    WSACleanup();

    return 1;

  }

  // 监听套接字

  ret = listen(listenSocket, SOMAXCONN);

  if (ret == SOCKET_ERROR)

  {

    cout << "listen failed with error " << WSAGetLastError() << endl;

    closesocket(listenSocket);

    WSACleanup();

    return 1;

  }

  // 接受连接

  sockaddr_in clientAddr;

  int clientAddrLen = sizeof(clientAddr);

  SOCKET clientSocket = accept(listenSocket, (sockaddr*)&clientAddr, &clientAddrLen);

  if (clientSocket == INVALID_SOCKET)

  {

    cout << "accept failed with error " << WSAGetLastError() << endl;

    closesocket(listenSocket);

    WSACleanup();

    return 1;

  }

  // 接收数据

  char buffer[1024];

  memset(buffer, 0, sizeof(buffer));

  ret = recv(clientSocket, buffer, sizeof(buffer), 0);

  if (ret == SOCKET_ERROR)

  {

    cout << "recv failed with error " << WSAGetLastError() << endl;

    closesocket(clientSocket);

    WSACleanup();

    return 1;

  }

  // 处理数据

  string message(buffer);

  cout << "收到消息:" << message << endl;

  // 发送数据

  message = "欢迎!";

  ret = send(clientSocket, message.c_str(), message.size(), 0);

  if (ret == SOCKET_ERROR)

  {

    cout << "send failed with error " << WSAGetLastError() << endl;

    closesocket(clientSocket);

    WSACleanup();

    return 1;

  }

  // 关闭套接字

  closesocket(clientSocket);

  closesocket(listenSocket);

  WSACleanup();

  return 0;

}

客户端:


#include <iostream>

#include <string>

#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

using namespace std;

int main()

{

  // 初始化Winsock

  WSADATA wsaData;

  WORD wVersion = MAKEWORD(2, 2);

  int ret = WSAStartup(wVersion, &wsaData);

  if (ret != 0)

  

    cout << "WSAStartup failed with error " << ret << endl;

    return 1;

  

  // 创建套接字

  SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

  if (clientSocket == INVALID_SOCKET)

  {

    cout << "socket failed with error " << WSAGetLastError() << endl;

    WSACleanup();

    return 1;

  }

  // 连接服务器

  sockaddr_in serverAddr;

  serverAddr.sin_family = AF_INET;

  serverAddr.sin_port = htons(1234);

  serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

  ret = connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr));

  if (ret == SOCKET_ERROR)

  {

    cout << "connect failed with error " << WSAGetLastError() << endl;

    closesocket(clientSocket);

    WSACleanup();

    return 1;

  }

  // 发送数据

  string message = "你好!";

  ret = send(clientSocket, message.c_str(), message.size(), 0);

  if (ret == SOCKET_ERROR)

  {

    cout << "send failed with error " << WSAGetLastError() << endl;

    closesocket(clientSocket);

    WSACleanup();

    return 1;

  }

  // 接收数据

  char buffer[1024];

  memset(buffer, 0, sizeof(buffer));

  ret = recv(clientSocket, buffer, sizeof(buffer), 0);

  if (ret == SOCKET_ERROR)

  {

    cout << "recv failed with error " << WSAGetLastError() << endl;

    closesocket(clientSocket);

    WSACleanup();

    return 1;

  }

  // 处理数据

  message = string(buffer);

  cout << "收到消息:" << message << endl;

  // 关闭套接字

  closesocket(clientSocket);

  WSACleanup();

  return 0;

}

在程序中,服务器端先创建一个socket,然后对该socket进行bind、listen等操作,以便客户端能够连接上来。客户端则需要创建一个socket,并连接到服务器端。然后,在连接成功后,通过socket发送和接收数据。

在实际使用C++ TCP/IP编程时,需要注意以下几点:

1. 需要包含相应的头文件和使用winsock2库。

2. 在使用socket前,需要初始化Winsock。

3. 在使用socket后,需要及时关闭socket。

4. 发送和接收数据需要注意数据的大小和格式。

总之,C++ TCP/IP编程是编写网络应用程序的一种重要方式,掌握C++ TCP/IP编程技术对于网络开发人员来说是非常重要的。通过套接字与网络编程模式掌握 TCP/IP编程,可以实现更多的通信链路与操作,在区块链、云计算等大数据网络领域中拥有广阔的应用前景。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复