c实现 udp通信

1.创建对象

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

AF_INET    网络通信协议

SOCK_DGRAM  传输协议

属性默认 0

2.想接收信息就需要绑定地址信息

struct sockaddr_in server_addr ;
server_addr . sin_family = AF_INET ;
server_addr . sin_port = htons ( 端口 ); //自选
server_addr . sin_addr . s_addr = INADDR_ANY ; //
有网卡地址
bind ( udp_socket , ( struct sockaddr * ) & server_addr sizeof ( server_addr ));
3.接收信息

  struct sockaddr_in clien_addr; //可以获取发送端信息

 int len=sizeof(clien_addr);

recvfrom(udp_socket,buf,1024,0,(struct sockaddr *)&clien_addr,&len);

如不需要获取发送端信息就

recvfrom(udp_socket,buf,1024,0,NULL,NULL);

4.发送信息

(需要接收端的信息才能发送,设置发送结构体)

        struct sockaddr_in dest_addr;

        dest_addr.sin_family = AF_INET;

        dest_addr.sin_port   = htons(3021);

        dest_addr.sin_addr.s_addr = INADDR_ANY; //或 inet_addr("192.168.64.183") 根据具体网址

        sendto(udp_socket,buf,strlen(buf),0,(struct sockaddr *)&dest_addr,sizeof(dest_addr));

5.关闭

close(udp_socket);

udp 开启组播

(组播相当于开启群聊)

1.创建对象

int udp_socket = socket ( AF_INET , SOCK_DGRAM , 0 );
2.绑定对象
struct sockaddr_in server_addr ;
server_addr . sin_family = AF_INET ;
server_addr . sin_port = htons ( 端口 );
server_addr . sin_addr . s_addr = INADDR_ANY ; // 所 有网卡地址
bind ( udp_socket ,( struct sockaddr * ) & server_addr , sizeof ( server_addr ));
3.加入组播

    struct ip_mreq a;  //组播结构体  

    bzero(&a, sizeof(a));

    a.imr_interface.s_addr = INADDR_ANY; //所有网卡地址加入组播

    a.imr_multiaddr.s_addr = inet_addr("224.10.10.10"); // 指定多播地址

setsockopt(udp_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &a, sizeof(a));

struct ip_mreq
{
struct in_addr imr_interface ; /* 需要加入组 播的IP 地址 */
struct in_addr imr_multiaddr ; /* 组播地址 (D 类地址) */
};
D 类地址 : 224.0 . 0.1 ~ 239.255 . 255.255
// 组播结构体
struct in_addr
{
in_addr_t s_addr ;
};

4.接收与发送

recvfrom(udp_socket,buf,1024,0,NULL,NULL);          // 还是直接用udp对象就可以接收

 

   struct sockaddr_in arry_addr;  // 将发送到对象的结构体

   arry_addr.sin_family=AF_INET;

  arry_addr.sin_port=htons(8888);

 arry_addr.sin_addr.s_addr=inet_addr("224.10.10.10"); 

 sendto(udp_socket,buf,strlen(buf),0,(struct sockaddr *)&arry_addr,sizeof(arry_addr));

(需注意设置结构体需要与绑定对象的端口相同,网址为设置组播的网址)

udp广播

1.创建对象

int udp_socket = socket ( AF_INET , SOCK_DGRAM , 0 );
2.开启广播(即设置为广播属性)

    int on=1; //开启

  setsockopt(udp_socket,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));

3.发送广播信息

    struct sockaddr_in dest_addr;

    dest_addr.sin_family=AF_INET; //设置网络协议

    dest_addr.sin_port=htons(6666); //所有处于当前网段且,端口为 6666 的进程都可以收到数据

                                                        //即192.168.64网段的都能收到

    dest_addr.sin_addr.s_addr=inet_addr("192.168.64.255"); //设置广播地址 

    sendto(udp_socket,"hello",5,0,(struct sockaddr *)&dest_addr,sizeof(dest_addr));

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++可以通过使用套接字(Socket)来实现UDP通信。下面是一个简单的C++代码示例,演示了如何使用UDP套接字进行通信: ```cpp #include <iostream> #include <string> #include <cstring> #include <arpa/inet.h> #include <sys/socket.h> int main() { // 创建UDP套接字 int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd == -1) { std::cerr << "Failed to create socket" << std::endl; return -1; } // 设置服务器地址和端口 struct sockaddr_in serverAddr{}; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(12345); // 设置端口号 serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 设置IP地址 // 发送数据 std::string message = "Hello, UDP Server!"; if (sendto(sockfd, message.c_str(), message.size(), 0, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == -1) { std::cerr << "Failed to send data" << std::endl; close(sockfd); return -1; } // 接收数据 char buffer[1024]; memset(buffer, 0, sizeof(buffer)); socklen_t serverAddrLen = sizeof(serverAddr); if (recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&serverAddr, &serverAddrLen) == -1) { std::cerr << "Failed to receive data" << std::endl; close(sockfd); return -1; } // 输出接收到的数据 std::cout << "Received data: " << buffer << std::endl; // 关闭套接字 close(sockfd); return 0; } ``` 上述代码中,首先创建了一个UDP套接字,然后设置服务器的地址和端口。接下来,使用`sendto`函数发送数据到服务器,并使用`recvfrom`函数接收服务器返回的数据。最后,关闭套接字。 注意:上述代码只是一个简单的示例,实际应用中可能需要进行错误处理、超时处理等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值