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