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));

你可能感兴趣的:(udp,c语言,网络协议)