网络编程 day03 (linux) UDP 协议的传输 与函数 getsockopt setsockopt sendto(经socket传送数据)recvfrom
1.UDP協議的特點
UDP(User Datagram Protocol)用戶數據報協議,是不可靠的無連接的協議。在數據發送前,因為不需要進行連接,所以可以進行高效率的數據傳輸。
適用情況:
1.發送小尺寸數據(如對DNS服務器進行IP地址查詢時)
2.在接收到數據,給出應答較困難的網絡中使用UDP。(如:無線網絡)
3.適合于廣播/組播式通信中。
4.MSN/QQ/Skype等即時通訊軟件的點對點文本通訊以及音視頻通訊通常采用UDP協議
5.流媒體、VOD、VoIP、IPTV等網絡多媒體服務中通常采用UDP方式進行實時數據傳輸
2.UDP的介紹
UDP是無連接的、不可靠的數據協議報,而TCP是面向連接的,提供可靠的字節流。然而,有些情況下更適合用UDP而不是TCP。有些流行的應用程序是用UDP實現的:DNS(域名系統)、NFS(網絡文件系統)和SNMP(簡單網絡管理協議)就是這樣的例子。Tftp協議:udp
3.UDP 的傳輸
4.UDP和TCP區別
1.UDP協議是一種無連接的協議
2.不需要通過三次握手來建立一個連接
3.一個UDP應用可同時作為應用的客戶或服務器方
4.由于UDP協議并不需要建立一個明確的連接,因此建立UDP應用要比建立TCP應用簡單得多
5.函數
getsockopt? 查看套接字的屬性
?原型 :int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);
參數:
sockfd? ? ?網絡 套接字
level? ? ? ?SOL_SOCKET
optname? ?SO_BROADCAST
optval:指針,指向存放所獲得選項值的緩沖區。
optlen:指針,指向optval緩沖區的長度值。
返回值:若無錯誤發生,getsockopt()返回0。否則的話,返回SOCKET_ERROR錯誤,應用程序可通過WSAGetLastError()獲取相應錯誤代碼。
?
setsockopt 修改套接字的屬性
原型:? int setsockopt(int sockfd, int level, int optname,?const void *optval, socklen_t optlen);
參數:
sockfd? ? ?網絡 套接字
level? ? ? ?SOL_SOCKET
optname? ?SO_BROADCAST
optval:指針,指向存放所獲得選項值的緩沖區。
optlen:指針,指向optval緩沖區的長度值。
返回值:若無錯誤發生,getsockopt()返回0。否則的話,返回SOCKET_ERROR錯誤,應用程序可通過WSAGetLastError()獲取相應錯誤代碼。
sendto? UDP 發送信息
原型: ssize_t sendto(int socket, void *message, size_t length, int flags, struct sockaddr *dest_addr, socklen_t dest_len);
參數:
socket? ? ? ? ? ?網絡套接字
message? ? ? 字符串的地址
length? ? ? ? ? ?字符串的長度
flags? ? ? ? ? ? 一般設0
dest_addr? ? 發送地點 的 struct sockaddr 類型的參數?
dest_len? ? ?struct sockaddr 類型的參數 的大小。
返回值 成功則返回接收到的字符數,失敗則返回-1,錯誤原因存于errno中。
recvform? UDP 接收信息
原型 :ssize_t recvfrom(int socket, void *buffer, size_t length, int flags, struct sockaddr *address, socklen_t *address_len);
參數:
socket? ? ? ? ? ?網絡套接字
buffer? ? ? ?字符串的地址
length? ? ? ? ? ?字符串的長度
flags? ? ? ? ? ? 一般設0
address? ? 接受信息地點 的 struct sockaddr 類型的參數?
address_len? ? ?struct sockaddr 類型的參數 的大小。
返回值 成功則返回接收到的字符數,失敗則返回-1,錯誤原因存于errno中。
6. 程序的功能:實現UDP 的通信?
要求: 1.服務端 給客戶端 發送菜單1. sendtime ?2.savetime
? ? ? ? ? ? ? ? 客戶端 回復sendtime? ?服務端就給客戶端發送? 時間。
???????????????? 客戶端 回復savetime? ?服務端就給文件里面存放? 時間。
服務器? ?(客戶端? telnet 命令???)(多用戶也可以 )
代碼:
/*************************************************************************************************************************************************************************************************************************文件名:*作 者:She001*時 間:*版 本:*作 用: 線程的多用戶連接菜單的輸入 ****************************************************************************************************************************************************************************************************************************/ #include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<stdbool.h> #include<time.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<errno.h> #include<sys/wait.h> #include<a.out.h> #include<signal.h> #include<stdarg.h> #include<sys/socket.h> #include<utime.h> #include<sys/utsname.h> #include<sys/times.h> #include<sys/un.h> #include<ctype.h> #include<dirent.h> #include<sys/time.h> #include<sys/resource.h> #include<syslog.h> #include<pthread.h> #include<semaphore.h> #include<sys/time.h> #include<sys/ipc.h> #include<sys/sem.h> #include<sys/msg.h> #include<arpa/inet.h> #include<sys/socket.h> #include<netinet/in.h> #include<netdb.h>void time1() {FILE* fp =fopen("1.txt","a+");time_t tm1 =time(NULL); //輸出函char *s = ctime(&tm1);fprintf(fp,"%s\n",s);fclose(fp);} char * return_time() {//FILE* fp =fopen("1.txt","a+");time_t tm1 =time(NULL); //輸出函char *s = ctime(&tm1);//fprintf(fp,"%s\n",s);//fclose(fp);return s; }void *pthread_fun(void* arg) {int cid =*((int *)arg);char buff[128]="";int len =0;char sendbuff[128]="";char caidan[1000]=" 1. sendtime 2.savetime\n";while(1){bzero(buff,sizeof(buff));send(cid,caidan,strlen(caidan),0);recv(cid,buff,sizeof(buff),0);printf("cid =%d : %s",cid,buff);if(strncmp(buff,"quit",4)==0){shutdown(cid,SHUT_RDWR);close(cid);break;}if(strncmp(buff,"sendtime",8)==0){printf("1\n");bzero(buff,sizeof(buff));strcpy(buff,return_time());printf("%s\n",buff);send(cid,buff,strlen(buff),0);}if(strncmp(buff,"savetime",8)==0){time1();}}return NULL; }int main(int argc,char *argv[]) {//參數判斷if(argc <3){perror("agc error\n");return -1;}//1.創建套接字int sid =socket(AF_INET,SOCK_STREAM,0);//服務端的sidif(sid<0){perror("socket error\n");return -2;}printf("sid=%d\n",sid);//2.綁定 bind 函數經常失敗struct sockaddr_in server_addr={0};server_addr.sin_family=AF_INET;server_addr.sin_port=htons(atoi(argv[2])); //端口號的轉換 字符串-主機整數--網絡整數server_addr.sin_addr.s_addr=inet_addr(argv[1]);//主機字符串 --網絡字節序int reslg=bind(sid,(struct sockaddr*)&server_addr,sizeof(server_addr));if(reslg==-1){perror("bind error\n");return -2;}printf("bind success ok\n");//3.監聽 listen if(listen(sid,10)<0){perror("listen error\n");return -3;}printf("listen is successful\n");//4.accept()//建立連接//struct sockaddr_in client_addr ={0};//int size =sizeof(client_addr);int cid=-1;char buff[1024]="";char kk[100]="";pthread_t tid=0;while(1){ cid=accept(sid,NULL,NULL);printf("cid =%d\n",cid);if(cid!=-1){//客戶連接成功!pthread_create(&tid,NULL,pthread_fun,&cid);}}return 0;}7. 寫一個可以連接上面的客戶端
代碼:
/*************************************************************************************************************************************************************************************************************************文件名:*作 者:She001*時 間:*版 本:*作 用:客戶端 ****************************************************************************************************************************************************************************************************************************/ #include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<stdbool.h> #include<time.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<errno.h> #include<sys/wait.h> #include<a.out.h> #include<signal.h> #include<stdarg.h> #include<sys/socket.h> #include<utime.h> #include<sys/utsname.h> #include<sys/times.h> #include<sys/un.h> #include<ctype.h> #include<dirent.h> #include<sys/time.h> #include<sys/resource.h> #include<syslog.h> #include<pthread.h> #include<semaphore.h> #include<sys/time.h> #include<sys/ipc.h> #include<sys/sem.h> #include<sys/msg.h> #include<arpa/inet.h> #include<sys/socket.h> #include<netinet/in.h> #include<netdb.h> // int main(int argc,char *argv[]) {int sid =socket(AF_INET,SOCK_STREAM,0);//服務端的sidif(sid<0){perror("socket error\n");return -2;}printf("sid=%d\n",sid);//2.綁定 bind 函數經常失敗struct sockaddr_in server_addr={0};server_addr.sin_family=AF_INET;server_addr.sin_port=htons(atoi(argv[2])); //端口號的轉換 字符串-主機整數--網絡整數server_addr.sin_addr.s_addr=inet_addr(argv[1]);//主機字符串 --網絡字節序while(connect(sid,(struct sockaddr*)&server_addr,sizeof(struct sockaddr)));{perror("connect error\n");sleep(1);}printf("connect ok\n");char buff[128]="";char *str ="hello\r\n";while(1){bzero(buff,sizeof(buff));send(sid,str,strlen(str),0);fgets(buff,sizeof(buff),stdin);send(sid,buff,strlen(buff),0);printf("%s",buff);}return 0;}8.修改網絡套接字的屬性 使他把recvfrom 的堵塞屬性 刪除
代碼:
/*************************************************************************************************************************************************************************************************************************文件名:*作 者:She001*時 間:*版 本:*作 用:UDP 接受端 ****************************************************************************************************************************************************************************************************************************/ #include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<stdbool.h> #include<time.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<errno.h> #include<sys/wait.h> #include<a.out.h> #include<signal.h> #include<stdarg.h> #include<sys/socket.h> #include<utime.h> #include<sys/utsname.h> #include<sys/times.h> #include<sys/un.h> #include<ctype.h> #include<dirent.h> #include<sys/time.h> #include<sys/resource.h> #include<syslog.h> #include<pthread.h> #include<semaphore.h> #include<sys/time.h> #include<sys/ipc.h> #include<sys/sem.h> #include<sys/msg.h> #include<arpa/inet.h> #include<sys/socket.h> #include<netinet/in.h> #include<netdb.h> //1.UDP 協議 接受端的編程 //1.socket 數據報套接字 //2.bind : 把自己的ip port 綁定好 //3.recvfrom 讀寫操作 while(1) printf() //4.close //int main(int argc,char *argv[]) {if(argc <3){perror("argc error\n");return -1;}int cid = socket(AF_INET,SOCK_DGRAM,0);if(cid ==-1){perror("cid error\n");return -2;}printf("socket ok\n");struct sockaddr_in caddr={0};caddr.sin_family =AF_INET;caddr.sin_port =htons(atoi(argv[2]));caddr.sin_addr.s_addr =inet_addr(argv[1]);if(bind(cid,(struct sockaddr*)&caddr,sizeof(caddr))<0){perror("bind error\n");return -2;}printf("bind success\n");//讀寫操作 read recv readform 堵塞屬性//一次讀 + while(); 循環讀 /// //修改文件描述符號的屬性(堵塞屬性) int flg = fcntl(cid,F_GETFL); int newflg = flg| O_NONBLOCK; int res = fcntl(cid,F_SETFL,newflg);//轉換為不堵塞//不要堵塞的,改回來 //fcntl(cid,F_SETFL,flg); ///char buff[128]="";struct sockaddr_in saddr={0};int size =sizeof(saddr);char ip[128]="";while(1){recvfrom(cid,buff,sizeof(buff)-1,0,(struct sockaddr*)&saddr,&size);printf("%d %s\n",ntohs(saddr.sin_port),inet_ntop(AF_INET,&saddr.sin_addr.s_addr,ip,20));printf("%s\n",buff);//bzero(buff,sizeof(buff));//fgets(buff,sizeof(buff),stdin);//sendto(cid,buff,strlen(buff),0,(struct sockaddr*)&caddr,sizeof(struct sockaddr));sleep(1);}close(cid);return 0;}9.程序功能:UDP協議通信? ? 實現你一句,我一句的對話的客戶端 (先說話)
代碼:
/*************************************************************************************************************************************************************************************************************************文件名:*作 者:She001*時 間:*版 本:*作 用:UDP 接受端 ****************************************************************************************************************************************************************************************************************************/ #include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<stdbool.h> #include<time.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<errno.h> #include<sys/wait.h> #include<a.out.h> #include<signal.h> #include<stdarg.h> #include<sys/socket.h> #include<utime.h> #include<sys/utsname.h> #include<sys/times.h> #include<sys/un.h> #include<ctype.h> #include<dirent.h> #include<sys/time.h> #include<sys/resource.h> #include<syslog.h> #include<pthread.h> #include<semaphore.h> #include<sys/time.h> #include<sys/ipc.h> #include<sys/sem.h> #include<sys/msg.h> #include<arpa/inet.h> #include<sys/socket.h> #include<netinet/in.h> #include<netdb.h> //1.UDP 協議 接受端的編程 //1.socket 數據報套接字 //2.bind : 把自己的ip port 綁定好 //3.recvfrom 讀寫操作 while(1) printf() //4.close //int main(int argc,char *argv[]) {if(argc <3){perror("argc error\n");return -1;}int cid = socket(AF_INET,SOCK_DGRAM,0);if(cid ==-1){perror("cid error\n");return -2;}printf("socket ok\n");struct sockaddr_in caddr={0};caddr.sin_family =AF_INET;caddr.sin_port =htons(atoi(argv[2]));caddr.sin_addr.s_addr =inet_addr(argv[1]); /*if(bind(cid,(struct sockaddr*)&caddr,sizeof(caddr))<0){perror("bind error\n");return -2;}printf("bind success\n"); *///讀寫操作 read recv readform 堵塞屬性//一次讀 + while(); 循環讀 /// //修改文件描述符號的屬性(堵塞屬性) //int flg = fcntl(cid,F_GETFL); //int newflg = flg| O_NONBLOCK; //int res = fcntl(cid,F_SETFL,newflg);//轉換為不堵塞//不要堵塞的,改回來 //fcntl(cid,F_SETFL,flg); ///char buff[128]="";struct sockaddr_in saddr={0};int size =sizeof(saddr);char ip[128]="";pid_t pid=fork();while(1){bzero(buff,sizeof(buff));fgets(buff,sizeof(buff),stdin);sendto(cid,buff,strlen(buff),0,(struct sockaddr*)&caddr,sizeof(struct sockaddr));bzero(buff,sizeof(buff));recvfrom(cid,buff,sizeof(buff)-1,0,(struct sockaddr*)&saddr,&size);printf("%d %s\n",ntohs(saddr.sin_port),inet_ntop(AF_INET,&saddr.sin_addr.s_addr,ip,20));printf("%s\n",buff);}close(cid);return 0;}10.UDP協議通信? ? 實現你一句,我一句的對話的服務端 (先接受信息,再發送)
代碼:
/*************************************************************************************************************************************************************************************************************************文件名:*作 者:She001*時 間:*版 本:*作 用:UDP 接受端 ****************************************************************************************************************************************************************************************************************************/ #include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<stdbool.h> #include<time.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<errno.h> #include<sys/wait.h> #include<a.out.h> #include<signal.h> #include<stdarg.h> #include<sys/socket.h> #include<utime.h> #include<sys/utsname.h> #include<sys/times.h> #include<sys/un.h> #include<ctype.h> #include<dirent.h> #include<sys/time.h> #include<sys/resource.h> #include<syslog.h> #include<pthread.h> #include<semaphore.h> #include<sys/time.h> #include<sys/ipc.h> #include<sys/sem.h> #include<sys/msg.h> #include<arpa/inet.h> #include<sys/socket.h> #include<netinet/in.h> #include<netdb.h> //1.UDP 協議 接受端的編程 //1.socket 數據報套接字 //2.bind : 把自己的ip port 綁定好 //3.recvfrom 讀寫操作 while(1) printf() //4.close //int main(int argc,char *argv[]) {if(argc <3){perror("argc error\n");return -1;}int cid = socket(AF_INET,SOCK_DGRAM,0);if(cid ==-1){perror("cid error\n");return -2;}printf("socket ok\n");struct sockaddr_in caddr={0};caddr.sin_family =AF_INET;caddr.sin_port =htons(atoi(argv[2]));caddr.sin_addr.s_addr =inet_addr(argv[1]);if(bind(cid,(struct sockaddr*)&caddr,sizeof(caddr))<0){perror("bind error\n");return -2;}printf("bind success\n");//讀寫操作 read recv readform 堵塞屬性//一次讀 + while(); 循環讀 /// //修改文件描述符號的屬性(堵塞屬性) //int flg = fcntl(cid,F_GETFL); //int newflg = flg| O_NONBLOCK; //int res = fcntl(cid,F_SETFL,newflg);//轉換為不堵塞//不要堵塞的,改回來 //fcntl(cid,F_SETFL,flg); ///char buff[128]="";struct sockaddr_in saddr={0};int size =sizeof(saddr);char ip[128]="";pid_t pid=fork();while(1){bzero(buff,sizeof(buff));recvfrom(cid,buff,sizeof(buff)-1,0,(struct sockaddr*)&saddr,&size);printf("%d %s\n",ntohs(saddr.sin_port),inet_ntop(AF_INET,&saddr.sin_addr.s_addr,ip,20));printf("%s\n",buff);bzero(buff,sizeof(buff));fgets(buff,sizeof(buff),stdin);sendto(cid,buff,strlen(buff),0,(struct sockaddr*)&saddr,sizeof(struct sockaddr));}close(cid);return 0;}11.程序的功能 :實現 每個用戶的無限說話,和無限接受信息 (利用了 進程? )(有四個參數? ,首先是? ?自己的 IP? ?自己的端口號 port? ? 別人的ip? ?別人的port? )
再次說 一下 sendto? ?recvform? 這兩個函數?
sendto 函數 這里面的? sockaddr_in? 類型的參數? 是 要發送給那個人的? ? 參數(發給誰,就填誰的信息)
recvfrom 函數 這里的?? sockaddr_in? 類型的參數? 只要是這樣類型的參數就行 ,但是當recvfrom 運行成功之后 ,這個參數會儲存? ?那個發你信息的人? ? ?的身份(IP? 和? port)。
代碼:
/*************************************************************************************************************************************************************************************************************************文件名:*作 者:She001*時 間:*版 本:*作 用:UDP 接受端 ****************************************************************************************************************************************************************************************************************************/ #include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<stdbool.h> #include<time.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<errno.h> #include<sys/wait.h> #include<a.out.h> #include<signal.h> #include<stdarg.h> #include<sys/socket.h> #include<utime.h> #include<sys/utsname.h> #include<sys/times.h> #include<sys/un.h> #include<ctype.h> #include<dirent.h> #include<sys/time.h> #include<sys/resource.h> #include<syslog.h> #include<pthread.h> #include<semaphore.h> #include<sys/time.h> #include<sys/ipc.h> #include<sys/sem.h> #include<sys/msg.h> #include<arpa/inet.h> #include<sys/socket.h> #include<netinet/in.h> #include<netdb.h> //1.UDP 協議 接受端的編程 //1.socket 數據報套接字 //2.bind : 把自己的ip port 綁定好 //3.recvfrom 讀寫操作 while(1) printf() //4.close //int main(int argc,char *argv[]) {if(argc <5){perror("argc error\n");return -1;}int cid = socket(AF_INET,SOCK_DGRAM,0);if(cid ==-1){perror("cid error\n");return -2;}printf("socket ok\n");struct sockaddr_in caddr={0};caddr.sin_family =AF_INET;caddr.sin_port =htons(atoi(argv[2]));caddr.sin_addr.s_addr =inet_addr(argv[1]);if(bind(cid,(struct sockaddr*)&caddr,sizeof(caddr))<0){perror("bind error\n");return -2;}printf("bind success\n");char buff[128]="";struct sockaddr_in saddr={0};saddr.sin_family =AF_INET;saddr.sin_port =htons(atoi(argv[4]));saddr.sin_addr.s_addr =inet_addr(argv[3]);int size =sizeof(saddr);char ip[128]="";int hh=1;if(hh==1){hh=0;pid_t pid=fork();if(pid==0){while(1){bzero(buff,sizeof(buff));recvfrom(cid,buff,sizeof(buff)-1,0,(struct sockaddr*)&caddr,&size);printf("%d %s\n",ntohs(saddr.sin_port),inet_ntop(AF_INET,&saddr.sin_addr.s_addr,ip,20));printf("%s\n",buff);}}if(pid>0){while(1){bzero(buff,sizeof(buff));fgets(buff,sizeof(buff),stdin);sendto(cid,buff,strlen(buff),0,(struct sockaddr*)&saddr,sizeof(struct sockaddr)); }}}close(cid);return 0;}12.程序內容:查看和設置套接字的各種選項
getsockopt
setsockopt
代碼:
/*************************************************************************************************************************************************************************************************************************文件名:*作 者:She001*時 間:*版 本:*作 用:獲取 socket 的屬性 或者是修改 單播 1對1 組播:對UDP 用戶組發送數據 ****************************************************************************************************************************************************************************************************************************/ #include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<stdbool.h> #include<time.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<errno.h> #include<sys/wait.h> #include<a.out.h> #include<signal.h> #include<stdarg.h> #include<sys/socket.h> #include<utime.h> #include<sys/utsname.h> #include<sys/times.h> #include<sys/un.h> #include<ctype.h> #include<dirent.h> #include<sys/time.h> #include<sys/resource.h> #include<syslog.h> #include<pthread.h> #include<semaphore.h> #include<sys/time.h> #include<sys/ipc.h> #include<sys/sem.h> #include<sys/msg.h> #include<arpa/inet.h> #include<sys/socket.h> #include<netinet/in.h> #include<netdb.h> //1.getsockopt setsockopt int main(int argc,char *argv[]) {int sid =socket(AF_INET,SOCK_DGRAM,0);printf("sid =%d \n",sid);//獲取屬性 0沒有 1有int value;int size =sizeof(value);getsockopt(sid,SOL_SOCKET,SO_BROADCAST,&value,&size);if(!value){printf("it has no brodcast function\n");printf("%d\n",value);}else{printf("it has brodcasr function\n");printf("%d\n",value);}//設置屬性 0沒有 1有value =1;int gg=setsockopt(sid,SOL_SOCKET,SO_BROADCAST,&value,sizeof((value)));if(gg<0){printf("setsockopt error\n");}printf("setsockopt ok\n");//在設置之后 ,再次查看getsockopt(sid,SOL_SOCKET,SO_BROADCAST,&value,&size);if(!value){printf("it has no brodcast function\n");printf("%d\n",value);}else{printf("it has brodcasr function\n");printf("%d\n",value);}return 0;}13.程序功能:廣播? 接受端
代碼:
#include <sys/types.h> #include <sys/socket.h> #include <stdlib.h> #include "stdio.h" #include <string.h> #include <unistd.h> #include <arpa/inet.h>//廣播接收方編程: //1.創建數據報套接字 //2.修改套接字屬性為可以廣播 接收方要綁定,發送方不用綁定 //3.接收方的ip地址選用INADDR_ANY //運行的過程中,把端口號寫成不同的。 //4.接收數據 //5.結束//應用程序 端口號 int main(int argc,char**argv) { //1.參數判斷if(argc < 2){perror("argc error\n");return -1;}//2.建立數據報套接字int cid = socket(AF_INET,SOCK_DGRAM,0);if(cid < 0){perror("socket error\n");return -1;}printf("socket dgram success:%d\n",cid);//3.修改數據報套接字的屬性,允許廣播int value = 0 ;int size = sizeof(value);if(getsockopt(cid,SOL_SOCKET,SO_BROADCAST,&value,&size)){perror("getsockopt error\n");return -1;}printf("getsockopt is ok\n");//把結果顯示出來printf("before value is %d\n",value); value = 1;if(setsockopt(cid,SOL_SOCKET,SO_BROADCAST,&value,size)){perror("setsockopt is error\n");return -2;}printf("setsockopt is ok\n");//再獲取udp屬性,查看一下if(getsockopt(cid,SOL_SOCKET,SO_BROADCAST,&value,&size)){perror("getsockopt error\n");return -1;}printf("after value is %d\n",value);struct sockaddr_in saddr = {0},baddr = {0};//3.綁定:綁定是綁定當前cid和當前id和地址,本地saddr.sin_family = AF_INET;//核心轉儲通常是因為 少參數造成的。saddr.sin_port = htons(10000);saddr.sin_addr.s_addr = INADDR_ANY;if(bind(cid,(struct sockaddr*)&saddr,sizeof(saddr))){perror("bind error\n");return -1;}printf("bind is ok\n");char ip[18] = "";//4.接收發送端傳來的數據char buff[128] = "";int size1 = sizeof(baddr);int len = recvfrom(cid,buff,sizeof(buff)-1,0,(struct sockaddr*)&baddr,&size1);//網絡字節序轉換成主機字節序端口號printf("server port:%d\n",ntohs(saddr.sin_port));printf("recv len = %d\n",len);//網絡字節序轉換成主機字節序字符串printf("server addr : %s\n",inet_ntop(AF_INET,&baddr.sin_addr.s_addr,ip,sizeof(ip)));//接收到的內容printf("content is : %s\n",buff);//4.關閉套接字close(cid);}14.程序功能:廣播發送端
代碼:
#include <sys/types.h> #include <sys/socket.h> #include <stdlib.h> #include "stdio.h" #include <string.h> #include <unistd.h> #include <arpa/inet.h>//1.udp廣播發送端編程 //1.建立數據報套接字 //2.修改數據報套接字屬性 //3.發送端雖然不綁定,但是要編寫要發送給誰的ip,所以,ip地址也要填寫INADDR_BROADCAST //4.發送 //5.結束//要聯網1對多,應用程序 端口號 int main(int argc,char**argv) { //1.參數判斷if(argc < 2){perror("argc error\n");return -1;}//2.建立數據報套接字int sid = socket(AF_INET,SOCK_DGRAM,0);if(sid < 0){perror("socket error\n");return -1;}printf("socket dgram success:%d\n",sid);//3.修改套接字屬性int value = 0 ;int size = sizeof(value);if(getsockopt(sid,SOL_SOCKET,SO_BROADCAST,&value,&size)){perror("getsockopt error\n");return -1;}printf("getsockopt is ok\n");//把結果顯示出來printf("before value is %d\n",value); value = 1;if(setsockopt(sid,SOL_SOCKET,SO_BROADCAST,&value,size)){perror("setsockopt is error\n");return -2;}printf("setsockopt is ok\n");//再獲取udp屬性,查看一下if(getsockopt(sid,SOL_SOCKET,SO_BROADCAST,&value,&size)){perror("getsockopt error\n");return -1;}printf("after value is %d\n",value);struct sockaddr_in raddr = {0};raddr.sin_family = AF_INET;raddr.sin_port = ntohs(atoi(argv[1]));raddr.sin_addr.s_addr = INADDR_BROADCAST;//發送給第一個接受端char *buff = "hello linux";int len = sendto(sid,buff,strlen(buff),0,(struct sockaddr*)&raddr,sizeof(raddr));printf("send len = %d\n",len);//4.關閉套接字close(sid);}總結
以上是生活随笔為你收集整理的网络编程 day03 (linux) UDP 协议的传输 与函数 getsockopt setsockopt sendto(经socket传送数据)recvfrom的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: abaqus 批量提取不同积分点的数据
- 下一篇: lc谐振计算机网络,LC谐振回路解析,L