您的位置:首页 > 运维架构

19---- Socket options

2014-09-13 08:47 176 查看
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);
}

                             
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息