21xrx.com
2024-11-05 17:30:58 Tuesday
登录
文章检索 我的文章 写文章
C++ UDP发送数据
2023-07-05 19:07:09 深夜i     --     --
C++ UDP 发送数据

C++是一种常用的编程语言,其在网络应用方面也具有不可磨灭的作用。UDP是一种与TCP相比速度更快、开销更小的传输协议,同时也更适合在低延迟、高带宽的网络环境下使用。本文将介绍使用C++语言发送UDP数据的方法。

首先,需要引入相关的头文件。以下是一个简单的UDP发送代码示例:


#include <iostream>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <cstring>

using namespace std;

int main(int argc, char **argv) {

  int sockfd;

  struct sockaddr_in servaddr;

  if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)

    cout << "socket error" << endl;

    return -1;

  

  memset(&servaddr, 0, sizeof(servaddr));

  servaddr.sin_family = AF_INET;

  servaddr.sin_port = htons(9999);

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

  const char *msg = "Hello, World!";

  int n = sendto(sockfd, msg, strlen(msg), 0, (struct sockaddr *) &servaddr, sizeof(servaddr));

  if (n < 0)

    cout << "sendto error" << endl;

    return -1;

   else

    cout << "send " << n << " bytes" << endl;

  

  close(sockfd);

  return 0;

}

解释一下上述代码的每一部分。

首先是引入头文件:


#include <iostream>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <cstring>

其中,`iostream`是C++的输入输出库;`sys/socket.h`是UNIX系统下的套接字头文件;`netinet/in.h`定义了Internet域相关的套接字地址结构;`arpa/inet.h`定义了互联网地址转换函数;`cstring`则定义了C++语言字符串处理相关函数。

接下来是定义了一个`main()`函数:


int main(int argc, char **argv)

  ...

  return 0;

其中,`argc`和`argv`是命令行参数个数和参数值。

接下来是定义了套接字和套接字地址:


int sockfd;

struct sockaddr_in servaddr;

if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)

  cout << "socket error" << endl;

  return -1;

memset(&servaddr, 0, sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_port = htons(9999);

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

`sockfd`是套接字描述符,`servaddr`定义了服务器的套接字地址。`memset()`函数将`servaddr`结构体的所有成员初始化为0,`sin_family`表示地址族为IPv4,`sin_port`表示端口号为9999,`sin_addr.s_addr`则表示服务器IP地址为"127.0.0.1"(本地环回地址)。

接下来是发送数据:


const char *msg = "Hello, World!";

int n = sendto(sockfd, msg, strlen(msg), 0, (struct sockaddr *) &servaddr, sizeof(servaddr));

if (n < 0)

  cout << "sendto error" << endl;

  return -1;

else

  cout << "send " << n << " bytes" << endl;

在上述代码中,`msg`是要发送的数据,`sockfd`是套接字描述符,`servaddr`是服务器的套接字地址,`sizeof(servaddr)`表示地址结构体的长度。`sendto()`函数将数据发送到服务器,`n`表示发送的字节数。如果发送失败,则输出错误信息。

最后是关闭套接字:


close(sockfd);

return 0;

`close()`函数关闭套接字描述符。

  
  

评论区

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