19---- Socket options

来源:互联网 发布:2017网络彩票最新消息 编辑:程序博客网 时间:2024/06/09 16:50

SOCKET 的一些选项的设置

            通用选项:   //// 可以通过 man 7 socket

           SOL_SCKET:

                   SO_BROADCAST      ---- 广播

                   SO_RCVBUF              ----描述符号的发送缓冲大小

                   SO_SNDBUF             -----描述符号的接收缓冲大小

                   SO_REUCSADDR     -----地址反复绑定

                   SO_TYPE                  -----描述符号类型SOCK_STREAM(流)/SOCK_DGRAM(报文)


其他选项可以通过一下方式获取:
——————————————————————

$ man   7   socket   --------------- socket选项

$ man   7   icmp      ---------------icmp选项

$ man   7  ip            --------------- ip选项

$ man  7   udp        --------------- udp选项

$ man  7   tcp         ---------------- tcp选项

—————————————————————

案例:

        使用选项进行数据广播

                  case_A    发送

                                    建立socket

                                    设置广播选项

                                   发送数据(广播方式发送)

             case_B     接收

                                 建立socket

                                 绑定地址

                                  接收数据

广播程序:

/// case_A.c #include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>main(){int fd;int opt=1;int r;struct sockaddr_in dr;//1. 选项设置fd = socket(AF_INET,SOCK_DGRAM,0);// AF_INET和PF_INET在这里都是一样的效果if(fd==-1) printf("socket err:%m\n"),exit(-1);r = setsockopt(fd,SOL_SOCKET,SO_BROADCAST,&opt,sizeof(opt));if(r==-1) printf("setsockopt err:%m\n"),exit(-1);dr.sin_family = AF_INET;dr.sin_port = htons(8888);// 2. 使用广播IP地址dr.sin_addr.s_addr = inet_addr("120.6.111.255");r = sendto(fd,"I am MT",strlen("I am MT"),0,(struct sockaddr*)&dr,sizeof(dr));if(r==-1) printf("sento err:%m\n"),exit(-1);close(fd);}


// case_B.c #include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>main(){int fd;int opt =1;char buf[100];int r;struct sockaddr_in dr;fd = socket(AF_INET,SOCK_DGRAM,0);if(fd == -1) printf("socket err:%m\n"),exit(-1);// 1. 选项r = setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));if(r==-1) printf("setsockopt err:%m\n"),exit(-1);dr.sin_family = AF_INET;dr.sin_port = htons(8888);// 2. 广播地址dr.sin_addr.s_addr = inet_addr("120.6.111.255");r = bind(fd,(struct sockaddr*)&dr,sizeof(dr));if(r==-1) printf("bind err:%m\n"),exit(-1);r = recv(fd,buf,100,0);if(r >0){buf[r] = 0;printf("广播数据:%s\n",buf);}close(fd);}

                             


0 0