int b_br = 1;
setsockopt(fd , SOL_SOCKET , SO_BROADCAST,&b_br , sizeof(int));
#include "net_exp.h"
void usage(const char* s){
printf("\n %s serv_ip ser_port \n",s);
printf("\n\t serv_ip:server ip address");
printf("\r\n serv_port: server port(>5000)\n");
}
int main(int argc, const char *argv[])
{
int fd = -1;
int port = 0;
struct sockaddr_in sin;
if((fd = socket(AF_INET , SOCK_DGRAM,0)) < 0 ){
perror("socket");
exit(1);
}
if(argc != 3 ){
usage(argv[0]);
exit(1);
}
port = atoi(argv[2]);
if (port < 5000){
usage(argv[0]);
exit(1);
}
int b_br = -1;
setsockopt(fd,SOL_SOCKET,SO_BROADCAST,&b_br,sizeof(int)); //允许广播
/*2、填充*/
bzero(&sin,sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(SERV_PORT);
if( inet_pton(AF_INET,argv[1],(void*)&sin.sin_addr) != 1){
perror("inet_ntop");
exit(1);
}
printf("broadcast starting ....... \n");
char buff[BUFSIZ];
while(1){
bzero(buff,BUFSIZ);
if(fgets(buff,BUFSIZ-1,stdin) == NULL){
perror("fgets");
continue;
}
sendto(fd,buff,strlen(buff),0,(struct sockaddr*)&sin,sizeof(sin));
if(!strncasecmp(buff , "quit\n",sizeof("quit\n"))){
printf("Client is exiting !!! \n");
break;
}
}
close(fd);
return 0;
}
struct ip_mreq
{
struct in_addr imr_multiaddr;
struct in_addr imr_interface;
};
struct ip_mreq mreq;
bzero(&mreq, sizeof(mreq));
mreq.imr_multiaddr.s_addr = inet_addr(“235.10.10.3”);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));
#include "net_udp.h"
int main(int argc, const char *argv[])
{
int fd = -1;
struct sockaddr_in sin;
/*1、创建socket fd*/
if((fd = socket(AF_INET , SOCK_DGRAM , 0)) < 0){
perror("socket");
exit(1);
}
/*优化1 : 允许客户端快速重连*/
int b_reuse = -1;
char server_ip[16];
setsockopt(fd , SOL_SOCKET, SO_REUSEADDR , &b_reuse , sizeof(int));
struct ip_mreq mreq;
bzero(&mreq, sizeof(mreq));
mreq.imr_multiaddr.s_addr = inet_addr(“235.10.10.3”); //
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));
/*2 、绑定*/
/*2.1 填充*/
bzero(&sin,sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(SERV_PORT);
sin.sin_addr.s_addr = htonl(INADDR_ANY);// INADDR_ANY :为0.0.0.0 泛指本机的意思
/*2.2 绑定*/
if(bind(fd , (struct sockaddr*)&sin, sizeof(sin))){
perror("bind");
exit(1);
}
if(!inet_ntop(AF_INET , (void*)&sin.sin_addr,server_ip,sizeof(sin))){
perror("inet_ntop");
exit(1);
}
printf("Server %s starting......\n",server_ip);
/*3、*/
char buff[BUFSIZ];
struct sockaddr_in cin;
socklen_t addrlen = sizeof(cin);
while(1){
bzero(buff, sizeof(buff));
if(recvfrom(fd , buff , BUFSIZ-1 , 0 ,(struct sockaddr*)&cin ,&addrlen) < 0){
perror("recvform");
continue;
}
char ipv4_addr[16];
if(!inet_ntop(AF_INET , (void*)&cin.sin_addr,ipv4_addr,sizeof(cin))){
perror("inet_ntop");
exit(1);
}
printf("Client (%s:%d) Send : %s \n",ipv4_addr,htons(sin.sin_port) ,buff);
if(!strncasecmp(buff,"quit\n",sizeof("quit\n"))){
printf("Client (%s : %d) is exiting \n",ipv4_addr , htons(sin.sin_port));
}
}
close(fd);
return 0;
}
第1字节为网络地址,其他3个字节为主机地址。第1字节的最高位固定为0
1.0.0.1 – 126.255.255.255
第1字节和第2字节是网络地址,其他2个字节是主机地址。第1字节的前两位固定为10
128.0.0.1 – 191.255.255.255
前3个字节是网络地址,最后1个字节是主机地址。第1字节的前3位固定为110
192.0.0.1 – 223.255.255.255
不分网络地址和主机地址,第1字节的前4位固定为1110
224.0.0.1 – 239.255.255.255
组播地址:224.0.0.1 – 239.255.255.255(除掉广播地址)
struct sockaddr_un //
{
sa_family_t sun_family;
char sun_path[108];
}
struct sockaddr_un myaddr;
bzero(&myaddr , sizeof(myaddr));
myaddr .sun_family = AF_UNIX;
strcpy(myaddr .sun_path , “/tmp/mysocket”);
— 绑定的地址 要是同一个 路径的 UNIX域套接字文件;
— 进程间的数据共享:
易用性:消息队列 > unix域套接字 > 管道 > 共享内存(经常要和信号量一起用)
效率 : 共享内存 > unix域套接字 > 管道 > 消息队列
常用 : 共享内存 、 unix域套接字
— 异步通信
— 同步和互斥(做资源保护)