凡科網的網站建設怎么做百度百家自媒體平臺注冊
1.廣播
發(fā)送端(類似于客戶端)
流程:
創(chuàng)建套接字
填充接收端(服務器)網絡信息結構體
bind(非必須綁定)
設置允許廣播
向接收端(服務器)發(fā)送數(shù)據(jù)
關閉套接字文件
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>#define ERR_MSG(msg) do{\fprintf(stderr,"LINE:__%d__",__LINE__);\perror(msg);\
}while(0)#define PORT 3333
#define IP "172.17,94.255"int main(int argc, const char *argv[])
{int fd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == fd){ERR_MSG("socket");return -1;}//填充接受端的網絡信息結構體struct sockaddr_in recvaddr;recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(PORT);recvaddr.sin_addr.s_addr = inet_addr(IP);//bind可綁可不綁//設置允許廣播int broad = 1;if(-1 == setsockopt(fd,SOL_SOCKET,SO_BROADCAST,\&broad,sizeof(broad))){ERR_MSG("setsockopt");return -1;}printf("broad set success broad = %d\n",broad);char buf[128] = "";ssize_t res = 0;while(1){//向服務器發(fā)送數(shù)據(jù)bzero(buf,sizeof(buf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] = 0;if(-1 == sendto(fd,buf,sizeof(buf),0,\(struct sockaddr*)&recvaddr,sizeof(recvaddr))){ERR_MSG("sendto");return -1;}printf("sendto success\n");}//關閉套接字close(fd);return 0;
}
接收端(類似于服務器)
流程:
創(chuàng)建套接字
填充接收端(本身)(服務器)的網絡信息結構體
bind(必須) 綁定套接字和自身的網絡信息結構體
新建一個網絡信息結構體,用來存儲發(fā)送端的地址信息
接受發(fā)送端發(fā)來的數(shù)據(jù)
關閉套接字
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>#define ERR_MSG(msg) do{\fprintf(stderr,"LINE:__%d__",__LINE__);\perror(msg);\
}while(0)#define PORT 3333
#define IP "172.17,94.255"int main(int argc, const char *argv[])
{int fd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == fd){ERR_MSG("socket");return -1;}//填充接受端的網絡信息結構體struct sockaddr_in recvaddr;int len = sizeof(recvaddr);recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(PORT);recvaddr.sin_addr.s_addr = inet_addr(IP);//必須綁定if(-1 == bind(fd,(struct sockaddr*)&recvaddr,len)){ERR_MSG("bind");return -1;}printf("bind success\n");//新建一個網絡信息結構體,用來存儲接受的數(shù)據(jù)從哪來struct sockaddr_in sendaddr;int sendlen = sizeof(sendaddr);char buf[128] = "";ssize_t res = 0;while(1){//接受發(fā)送端(客戶端)發(fā)來的數(shù)據(jù)bzero(buf,sizeof(buf));if(-1 == recvfrom(fd,buf,sizeof(buf),0,\(struct sockaddr*)&sendaddr,&sendlen)){ERR_MSG("recvfrom");return -1;}printf("recvfrom success\n");printf("[%s:%d] msg:%s\n",inet_ntoa(sendaddr.sin_addr),\ntohs(sendaddr.sin_port),buf);}//關閉套接字close(fd);return 0;
}
廣播
發(fā)送端(類似于客戶端)
流程:
創(chuàng)建套接字
填充接收端(服務器)的網絡信息結構體 (IP為廣播組的IP地址)
bind(非必須)
設置允許廣播
發(fā)送廣播信息
關閉套接字
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>#define ERR_MSG(msg) do{\fprintf(stderr,"LINE:__%d__",__LINE__);\perror(msg);\
}while(0)#define PORT 3333
#define IP "224.1.2.3"int main(int argc, const char *argv[])
{int fd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == fd){ERR_MSG("socket");return -1;}//填充接受端的網絡信息結構體struct sockaddr_in recvaddr;recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(PORT);recvaddr.sin_addr.s_addr = inet_addr(IP);//bind可綁可不綁//設置允許廣播int broad = 1;if(-1 == setsockopt(fd,SOL_SOCKET,SO_BROADCAST,\&broad,sizeof(broad))){ERR_MSG("setsockopt");return -1;}printf("broad set success broad = %d\n",broad);char buf[128] = "";ssize_t res = 0;while(1){//向服務器發(fā)送數(shù)據(jù)bzero(buf,sizeof(buf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] = 0;if(-1 == sendto(fd,buf,sizeof(buf),0,\(struct sockaddr*)&recvaddr,sizeof(recvaddr))){ERR_MSG("sendto");return -1;}printf("sendto success\n");}//關閉套接字close(fd);return 0;
}
接收端(類似于服務器)
流程:
創(chuàng)建套接字
填充接收端(自身、服務器)的網絡信息結構體(廣播組IP…)
bind(必須綁定)綁定服務器與套接字
填充廣播組的網絡信息結構體(廣播組IP,本地IP,網卡編號)
滴滴:查詢網卡編號:ifconfig 查看使用的是哪個網卡,再 ip ad 查看對應的編號
添加廣播組
新建一個網絡信息結構體用來存儲發(fā)送端的地址信息
循環(huán)接受信息
關閉套接字
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>#define ERR_MSG(msg) do{\fprintf(stderr,"LINE:__%d__",__LINE__);\perror(msg);\
}while(0)#define PORT 3333
#define IP "224.1.2.3"int main(int argc, const char *argv[])
{int fd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == fd){ERR_MSG("socket");return -1;}//填充接受端的網絡信息結構體struct sockaddr_in recvaddr;int len = sizeof(recvaddr);recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(PORT);recvaddr.sin_addr.s_addr = inet_addr(IP);//必須綁定if(-1 == bind(fd,(struct sockaddr*)&recvaddr,len)){ERR_MSG("bind");return -1;}printf("bind success\n");//加入多播組struct ip_mreqn mq;mq.imr_multiaddr.s_addr = inet_addr(IP);//多播組的組ipmq.imr_address.s_addr = inet_addr("172.17.94.145");//本地IPmq.imr_ifindex = 3;//網絡設備編號,指定網卡號if(-1 == setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,\&mq,sizeof(mq))){ERR_MSG("setsockopt");return -1;}printf("membership set succes ");//新建一個網絡信息結構體,用來存儲接受的數(shù)據(jù)從哪來struct sockaddr_in sendaddr;int sendlen = sizeof(sendaddr);char buf[128] = "";ssize_t res = 0;while(1){//接受發(fā)送端(客戶端)發(fā)來的數(shù)據(jù)bzero(buf,sizeof(buf));res = recvfrom(fd,buf,sizeof(buf),0,\(struct sockaddr*)&sendaddr,&sendlen);if(-1 == res){ERR_MSG("recvfrom");return -1;}else if(0 == res){printf("發(fā)送端退出\n");break;}printf("recvfrom success\n");printf("[%s:%d] msg:%s\n",inet_ntoa(sendaddr.sin_addr),\ntohs(sendaddr.sin_port),buf);}//關閉套接字close(fd);return 0;
}
結果: