19---- Socket options

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

                             


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值