21xrx.com
2024-11-08 20:23:24 Friday
登录
文章检索 我的文章 写文章
C++发送UDP:从入门到掌握
2023-06-29 08:48:56 深夜i     --     --
C++ UDP 入门 掌握 发送

UDP是一种传输层协议,在网络编程中被广泛使用。UDP协议具备简单、快速的特点,特别适用于数据包交换较少的应用场景。在C++语言中,我们可以使用套接字(socket)与UDP协议进行通信。本文将从入门到掌握的角度为大家介绍C++发送UDP的方法。

1. 创建UDP套接字

在C++语言中,我们首先需要创建UDP套接字。套接字是实现网络数据传输的基本单元,通过套接字与网络中的其他应用程序进行数据传输。

创建UDP套接字的代码如下所示:


#include <netinet/in.h>

#include <sys/socket.h>

#include <unistd.h>

#include <iostream>

int main()

{

   int serverSocket = socket(AF_INET, SOCK_DGRAM, 0);

   if (serverSocket == -1)

  

     std::cerr << "Failed to create socket..." << std::endl;

     return -1;

  

   // Other code goes here ...

   return 0;

}

其中,socket()函数的第一个参数指定所创建套接字的类型,第二个参数指定传输协议,第三个参数通常设置为0。

2. 绑定地址与端口

在创建UDP套接字之后,我们需要绑定端口与地址,以便数据传输。具体实现方法如下:


int main()

{

   int serverSocket = socket(AF_INET, SOCK_DGRAM, 0);

   if (serverSocket == -1)

  

     std::cerr << "Failed to create socket..." << std::endl;

     return -1;

  

   struct sockaddr_in serverAddress;

   serverAddress.sin_family = AF_INET;

   serverAddress.sin_port = htons(8080);

   serverAddress.sin_addr.s_addr = INADDR_ANY;

   int bindStatus = bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress));

   if (bindStatus == -1)

  

     std::cerr << "Failed to bind address and port..." << std::endl;

     return -1;

  

   // Other code goes here ...

   return 0;

}

其中,htons()函数将主机字节序转换为网络字节序,INADDR_ANY指定绑定任意地址,bind()函数用于绑定地址与端口。

3. 发送UDP数据包

接下来,我们可以通过sendto()函数发送UDP数据包。该函数具有以下参数:


ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

该函数的参数意义如下:

- sockfd:需要发送数据的套接字

- buf:要发送的数据

- len:发送数据的长度

- flags:发送数据时的附加标志

- dest_addr:数据包需要发送到的目标地址

- addrlen:目标地址的长度

具体实现代码如下:


int main()

{

   int serverSocket = socket(AF_INET, SOCK_DGRAM, 0);

   if (serverSocket == -1)

  

     std::cerr << "Failed to create socket..." << std::endl;

     return -1;

  

   struct sockaddr_in serverAddress;

   serverAddress.sin_family = AF_INET;

   serverAddress.sin_port = htons(8080);

   serverAddress.sin_addr.s_addr = INADDR_ANY;

   int bindStatus = bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress));

   if (bindStatus == -1)

  

     std::cerr << "Failed to bind address and port..." << std::endl;

     return -1;

  

   struct sockaddr_in destAddress;

   destAddress.sin_family = AF_INET;

   destAddress.sin_port = htons(8081);

   inet_aton("127.0.0.1", &destAddress.sin_addr);

   std::string data = "Hello, world!";

   ssize_t sendStatus = sendto(serverSocket, data.c_str(), data.size(), 0, (struct sockaddr *)&destAddress, sizeof(destAddress));

   if (sendStatus == -1)

  

     std::cerr << "Failed to send data..." << std::endl;

     return -1;

  

   // Other code goes here ...

   return 0;

}

其中,inet_aton()函数将IP地址转换为网络字节序,sendto()函数包含目标地址以便发送数据。

4. 接收UDP数据包

最后,我们需要实现接收UDP数据包的功能。该功能通过recvfrom()函数实现。该函数具有以下参数:


ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

该函数的参数意义如下:

- sockfd:接收数据的套接字

- buf:存放接收到数据的内存缓冲区

- len:缓冲区的长度

- flags:接收数据时的附加标志

- src_addr:发送数据的源地址

- addrlen:源地址的长度

具体实现代码如下:


int main()

{

   int serverSocket = socket(AF_INET, SOCK_DGRAM, 0);

   if (serverSocket == -1)

  

     std::cerr << "Failed to create socket..." << std::endl;

     return -1;

  

   struct sockaddr_in serverAddress;

   serverAddress.sin_family = AF_INET;

   serverAddress.sin_port = htons(8080);

   serverAddress.sin_addr.s_addr = INADDR_ANY;

   int bindStatus = bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress));

   if (bindStatus == -1)

  

     std::cerr << "Failed to bind address and port..." << std::endl;

     return -1;

  

   struct sockaddr_in destAddress;

   destAddress.sin_family = AF_INET;

   destAddress.sin_port = htons(8081);

   inet_aton("127.0.0.1", &destAddress.sin_addr);

   std::string data = "Hello, world!";

   ssize_t sendStatus = sendto(serverSocket, data.c_str(), data.size(), 0, (struct sockaddr *)&destAddress, sizeof(destAddress));

   if (sendStatus == -1)

  

     std::cerr << "Failed to send data..." << std::endl;

     return -1;

  

   char buffer[1024] = {0};

   ssize_t recvStatus = recvfrom(serverSocket, buffer, 1024, 0, nullptr, nullptr);

   if (recvStatus == -1)

  

     std::cerr << "Failed to receive data..." << std::endl;

     return -1;

  

   std::cout << "Received message: " << buffer << std::endl;

   return 0;

}

其中,recvfrom()函数将所接收到的数据存储到了之前定义的缓冲区中,并输出到控制台上。

总结

本文介绍了C++发送UDP数据包的完整流程,包括创建UDP套接字、绑定地址与端口、发送UDP数据包以及接收UDP数据包。通过本文的帮助,相信大家已经了解到了C++中使用UDP协议进行网络编程的基本方法,能够在实际应用中灵活运用。

  
  

评论区

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