21xrx.com
2025-04-02 11:58:45 Wednesday
文章检索 我的文章 写文章
C++ Socket 项目源代码编写
2023-07-12 06:05:58 深夜i     16     0
C++ Socket 项目 源代码 编写

C++ Socket 是一种用于网络编程的技术,它可实现不同计算机之间的数据通信。借助 C++ Socket 技术,开发人员能够开发出高效、稳定的网络应用程序。本文将介绍 C++ Socket 项目的源代码编写,以帮助开发人员更好地理解该技术。

首先,我们需要了解 C++ Socket 程序的基本结构。在 C++ 中,Socket 程序由服务器端和客户端两个部分组成。服务器端程序需要在其中开启监听器来等待客户端的连接请求,而客户端程序则需要通过 Socket 连接发送请求。了解了这一点后,我们就可以开始编写源代码了。

为了方便编写和调试代码,我们可以使用 Visual Studio 集成开发环境(IDE)来创建 C++ Socket 项目。在创建项目时,需要选择 C++ 语言和 Socket 应用程序模板。

接下来,我们开始编写服务器端代码。在服务器端程序中,需要定义一个 Socket,以便等待和接受客户端的请求。以下是服务器端程序的基本代码:

#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib") //Winsock Library
int main(int argc , char *argv[])
{
  WSADATA wsa;
  SOCKET s , new_socket;
  struct sockaddr_in server , client;
  int c;
  char *message;
  printf("\nInitialising Winsock...");
  if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
  {
    printf("Failed. Error Code : %d",WSAGetLastError());
    return 1;
  }
  
  printf("Initialised.\n");
  
  //Create a socket
  if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
  {
    printf("Could not create socket : %d" , WSAGetLastError());
  }
  
  printf("Socket created.\n");
  
  //Prepare the sockaddr_in structure
  server.sin_family = AF_INET;
  server.sin_addr.s_addr = INADDR_ANY;
  server.sin_port = htons( 8888 );
  
  //Bind
  if( bind(s ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR)
  {
    printf("Bind failed with error code : %d" , WSAGetLastError());
  }
  
  puts("Bind done");
  
  //Listen to incoming connections
  listen(s , 3);
  
  //Accept and incoming connection
  puts("Waiting for incoming connections...");
  
  c = sizeof(struct sockaddr_in);
  
  while( (new_socket = accept(s , (struct sockaddr *)&client, &c)) != INVALID_SOCKET )
  {
    puts("Connection accepted");
    
    //Reply to the client
    message = "Hello Client , I have received your connection. But I have to go now, bye\n";
    send(new_socket , message , strlen(message) , 0);
  }
  
  if (new_socket == INVALID_SOCKET)
  {
    printf("accept failed with error code : %d" , WSAGetLastError());
    return 1;
  }
  
  closesocket(s);
  WSACleanup();
  
  return 0;
}

以上代码段创建了一个监听套接字,等待来自客户端的连接请求。服务器在与客户端建立连接之后,即可发送数据。此代码段中,服务器端每当收到一个新的客户端连接请求时都会向客户端发送一条欢迎信息。

我们可以将上述代码片段中的服务器端代码复制到 Visual Studio 中的 Server.cpp 文件中。

接下来,我们编写客户端的代码:

#include <iostream>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib") //Winsock Library
int main(int argc, char *argv[])
{
  WSADATA wsa;
  SOCKET s;
  struct sockaddr_in server;
  char *message, server_reply[2000];
  int recv_size;
  
  printf("\nInitialising Winsock...");
  if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
  {
    printf("Failed. Error Code : %d",WSAGetLastError());
    return 1;
  }
  
  printf("Initialised.\n");
  
  //Create a socket
  if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
  {
    printf("Could not create socket : %d" , WSAGetLastError());
  }
  printf("Socket created.\n");
  
  server.sin_addr.s_addr = inet_addr("127.0.0.1");
  server.sin_family = AF_INET;
  server.sin_port = htons( 8888 );
  //Connect to remote server
  if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0)
  {
    puts("connect error");
    return 1;
  }
  
  puts("Connected");
  
  //Send some data
  message = "connect";
  if( send(s , message , strlen(message) , 0) < 0)
  {
    puts("Send failed");
    return 1;
  }
  puts("Data Send\n");
  
  //Receive a reply from the server
  if((recv_size = recv(s , server_reply , 2000 , 0)) == SOCKET_ERROR)
  {
    puts("recv failed");
  }
  
  puts("Reply received\n");
  server_reply[recv_size] = '\0';
  puts(server_reply);
  
  closesocket(s);
  WSACleanup();
  return 0;
}

以上代码段创建了一个客户端,向指定服务器 IP 地址和端口连接,并发送一条包含“connect”信息的数据。成功连接之后,客户端会收到来自服务器端的欢迎信息。

我们可以将上述代码片段中的客户端代码复制到 Visual Studio 中的 Client.cpp 文件中。

在编写完上述代码后,我们需要将其编译成可执行文件。在 Visual Studio 中,我们可以通过选择“生成”->“生成解决方案”命令编译项目。编译完成后,我们可以在生成的 Debug 文件夹中找到 Server.exe 和 Client.exe 两个可执行文件。

综上所述,我们介绍了 C++ Socket 项目源代码编写的相关知识,并展示了服务器端和客户端的基本代码。通过阅读本文,你将对 C++ Socket 技术有更深入的理解,并能够在日后的开发中更加灵活地使用该技术。

  
  

评论区