网络编程 day03 (linux) UDP 协议的传输 与函数 getsockopt setsockopt sendto(经socket传送数据)recvfrom
1.UDP協(xié)議的特點(diǎn)
UDP(User Datagram Protocol)用戶數(shù)據(jù)報(bào)協(xié)議,是不可靠的無(wú)連接的協(xié)議。在數(shù)據(jù)發(fā)送前,因?yàn)椴恍枰M(jìn)行連接,所以可以進(jìn)行高效率的數(shù)據(jù)傳輸。
適用情況:
1.發(fā)送小尺寸數(shù)據(jù)(如對(duì)DNS服務(wù)器進(jìn)行IP地址查詢時(shí))
2.在接收到數(shù)據(jù),給出應(yīng)答較困難的網(wǎng)絡(luò)中使用UDP。(如:無(wú)線網(wǎng)絡(luò))
3.適合于廣播/組播式通信中。
4.MSN/QQ/Skype等即時(shí)通訊軟件的點(diǎn)對(duì)點(diǎn)文本通訊以及音視頻通訊通常采用UDP協(xié)議
5.流媒體、VOD、VoIP、IPTV等網(wǎng)絡(luò)多媒體服務(wù)中通常采用UDP方式進(jìn)行實(shí)時(shí)數(shù)據(jù)傳輸
2.UDP的介紹
UDP是無(wú)連接的、不可靠的數(shù)據(jù)協(xié)議報(bào),而TCP是面向連接的,提供可靠的字節(jié)流。然而,有些情況下更適合用UDP而不是TCP。有些流行的應(yīng)用程序是用UDP實(shí)現(xiàn)的:DNS(域名系統(tǒng))、NFS(網(wǎng)絡(luò)文件系統(tǒng))和SNMP(簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議)就是這樣的例子。Tftp協(xié)議:udp
3.UDP 的傳輸
4.UDP和TCP區(qū)別
1.UDP協(xié)議是一種無(wú)連接的協(xié)議
2.不需要通過三次握手來建立一個(gè)連接
3.一個(gè)UDP應(yīng)用可同時(shí)作為應(yīng)用的客戶或服務(wù)器方
4.由于UDP協(xié)議并不需要建立一個(gè)明確的連接,因此建立UDP應(yīng)用要比建立TCP應(yīng)用簡(jiǎn)單得多
5.函數(shù)
getsockopt? 查看套接字的屬性
?原型 :int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);
參數(shù):
sockfd? ? ?網(wǎng)絡(luò) 套接字
level? ? ? ?SOL_SOCKET
optname? ?SO_BROADCAST
optval:指針,指向存放所獲得選項(xiàng)值的緩沖區(qū)。
optlen:指針,指向optval緩沖區(qū)的長(zhǎng)度值。
返回值:若無(wú)錯(cuò)誤發(fā)生,getsockopt()返回0。否則的話,返回SOCKET_ERROR錯(cuò)誤,應(yīng)用程序可通過WSAGetLastError()獲取相應(yīng)錯(cuò)誤代碼。
?
setsockopt 修改套接字的屬性
原型:? int setsockopt(int sockfd, int level, int optname,?const void *optval, socklen_t optlen);
參數(shù):
sockfd? ? ?網(wǎng)絡(luò) 套接字
level? ? ? ?SOL_SOCKET
optname? ?SO_BROADCAST
optval:指針,指向存放所獲得選項(xiàng)值的緩沖區(qū)。
optlen:指針,指向optval緩沖區(qū)的長(zhǎng)度值。
返回值:若無(wú)錯(cuò)誤發(fā)生,getsockopt()返回0。否則的話,返回SOCKET_ERROR錯(cuò)誤,應(yīng)用程序可通過WSAGetLastError()獲取相應(yīng)錯(cuò)誤代碼。
sendto? UDP 發(fā)送信息
原型: ssize_t sendto(int socket, void *message, size_t length, int flags, struct sockaddr *dest_addr, socklen_t dest_len);
參數(shù):
socket? ? ? ? ? ?網(wǎng)絡(luò)套接字
message? ? ? 字符串的地址
length? ? ? ? ? ?字符串的長(zhǎng)度
flags? ? ? ? ? ? 一般設(shè)0
dest_addr? ? 發(fā)送地點(diǎn) 的 struct sockaddr 類型的參數(shù)?
dest_len? ? ?struct sockaddr 類型的參數(shù) 的大小。
返回值 成功則返回接收到的字符數(shù),失敗則返回-1,錯(cuò)誤原因存于errno中。
recvform? UDP 接收信息
原型 :ssize_t recvfrom(int socket, void *buffer, size_t length, int flags, struct sockaddr *address, socklen_t *address_len);
參數(shù):
socket? ? ? ? ? ?網(wǎng)絡(luò)套接字
buffer? ? ? ?字符串的地址
length? ? ? ? ? ?字符串的長(zhǎng)度
flags? ? ? ? ? ? 一般設(shè)0
address? ? 接受信息地點(diǎn) 的 struct sockaddr 類型的參數(shù)?
address_len? ? ?struct sockaddr 類型的參數(shù) 的大小。
返回值 成功則返回接收到的字符數(shù),失敗則返回-1,錯(cuò)誤原因存于errno中。
6. 程序的功能:實(shí)現(xiàn)UDP 的通信?
要求: 1.服務(wù)端 給客戶端 發(fā)送菜單1. sendtime ?2.savetime
? ? ? ? ? ? ? ? 客戶端 回復(fù)sendtime? ?服務(wù)端就給客戶端發(fā)送? 時(shí)間。
???????????????? 客戶端 回復(fù)savetime? ?服務(wù)端就給文件里面存放? 時(shí)間。
服務(wù)器? ?(客戶端? telnet 命令???)(多用戶也可以 )
代碼:
/*************************************************************************************************************************************************************************************************************************文件名:*作 者:She001*時(shí) 間:*版 本:*作 用: 線程的多用戶連接菜單的輸入 ****************************************************************************************************************************************************************************************************************************/ #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[]) {//參數(shù)判斷if(argc <3){perror("agc error\n");return -1;}//1.創(chuàng)建套接字int sid =socket(AF_INET,SOCK_STREAM,0);//服務(wù)端的sidif(sid<0){perror("socket error\n");return -2;}printf("sid=%d\n",sid);//2.綁定 bind 函數(shù)經(jīng)常失敗struct sockaddr_in server_addr={0};server_addr.sin_family=AF_INET;server_addr.sin_port=htons(atoi(argv[2])); //端口號(hào)的轉(zhuǎn)換 字符串-主機(jī)整數(shù)--網(wǎng)絡(luò)整數(shù)server_addr.sin_addr.s_addr=inet_addr(argv[1]);//主機(jī)字符串 --網(wǎng)絡(luò)字節(jié)序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.監(jiān)聽 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. 寫一個(gè)可以連接上面的客戶端
代碼:
/*************************************************************************************************************************************************************************************************************************文件名:*作 者:She001*時(shí) 間:*版 本:*作 用:客戶端 ****************************************************************************************************************************************************************************************************************************/ #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);//服務(wù)端的sidif(sid<0){perror("socket error\n");return -2;}printf("sid=%d\n",sid);//2.綁定 bind 函數(shù)經(jīng)常失敗struct sockaddr_in server_addr={0};server_addr.sin_family=AF_INET;server_addr.sin_port=htons(atoi(argv[2])); //端口號(hào)的轉(zhuǎn)換 字符串-主機(jī)整數(shù)--網(wǎng)絡(luò)整數(shù)server_addr.sin_addr.s_addr=inet_addr(argv[1]);//主機(jī)字符串 --網(wǎng)絡(luò)字節(jié)序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.修改網(wǎng)絡(luò)套接字的屬性 使他把recvfrom 的堵塞屬性 刪除
代碼:
/*************************************************************************************************************************************************************************************************************************文件名:*作 者:She001*時(shí) 間:*版 本:*作 用: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 協(xié)議 接受端的編程 //1.socket 數(shù)據(jù)報(bào)套接字 //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(); 循環(huán)讀 /// //修改文件描述符號(hào)的屬性(堵塞屬性) int flg = fcntl(cid,F_GETFL); int newflg = flg| O_NONBLOCK; int res = fcntl(cid,F_SETFL,newflg);//轉(zhuǎn)換為不堵塞//不要堵塞的,改回來 //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協(xié)議通信? ? 實(shí)現(xiàn)你一句,我一句的對(duì)話的客戶端 (先說話)
代碼:
/*************************************************************************************************************************************************************************************************************************文件名:*作 者:She001*時(shí) 間:*版 本:*作 用: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 協(xié)議 接受端的編程 //1.socket 數(shù)據(jù)報(bào)套接字 //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(); 循環(huán)讀 /// //修改文件描述符號(hào)的屬性(堵塞屬性) //int flg = fcntl(cid,F_GETFL); //int newflg = flg| O_NONBLOCK; //int res = fcntl(cid,F_SETFL,newflg);//轉(zhuǎn)換為不堵塞//不要堵塞的,改回來 //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協(xié)議通信? ? 實(shí)現(xiàn)你一句,我一句的對(duì)話的服務(wù)端 (先接受信息,再發(fā)送)
代碼:
/*************************************************************************************************************************************************************************************************************************文件名:*作 者:She001*時(shí) 間:*版 本:*作 用: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 協(xié)議 接受端的編程 //1.socket 數(shù)據(jù)報(bào)套接字 //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(); 循環(huán)讀 /// //修改文件描述符號(hào)的屬性(堵塞屬性) //int flg = fcntl(cid,F_GETFL); //int newflg = flg| O_NONBLOCK; //int res = fcntl(cid,F_SETFL,newflg);//轉(zhuǎn)換為不堵塞//不要堵塞的,改回來 //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.程序的功能 :實(shí)現(xiàn) 每個(gè)用戶的無(wú)限說話,和無(wú)限接受信息 (利用了 進(jìn)程? )(有四個(gè)參數(shù)? ,首先是? ?自己的 IP? ?自己的端口號(hào) port? ? 別人的ip? ?別人的port? )
再次說 一下 sendto? ?recvform? 這兩個(gè)函數(shù)?
sendto 函數(shù) 這里面的? sockaddr_in? 類型的參數(shù)? 是 要發(fā)送給那個(gè)人的? ? 參數(shù)(發(fā)給誰(shuí),就填誰(shuí)的信息)
recvfrom 函數(shù) 這里的?? sockaddr_in? 類型的參數(shù)? 只要是這樣類型的參數(shù)就行 ,但是當(dāng)recvfrom 運(yùn)行成功之后 ,這個(gè)參數(shù)會(huì)儲(chǔ)存? ?那個(gè)發(fā)你信息的人? ? ?的身份(IP? 和? port)。
代碼:
/*************************************************************************************************************************************************************************************************************************文件名:*作 者:She001*時(shí) 間:*版 本:*作 用: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 協(xié)議 接受端的編程 //1.socket 數(shù)據(jù)報(bào)套接字 //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.程序內(nèi)容:查看和設(shè)置套接字的各種選項(xiàng)
getsockopt
setsockopt
代碼:
/*************************************************************************************************************************************************************************************************************************文件名:*作 者:She001*時(shí) 間:*版 本:*作 用:獲取 socket 的屬性 或者是修改 單播 1對(duì)1 組播:對(duì)UDP 用戶組發(fā)送數(shù)據(jù) ****************************************************************************************************************************************************************************************************************************/ #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);}//設(shè)置屬性 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");//在設(shè)置之后 ,再次查看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.創(chuàng)建數(shù)據(jù)報(bào)套接字 //2.修改套接字屬性為可以廣播 接收方要綁定,發(fā)送方不用綁定 //3.接收方的ip地址選用INADDR_ANY //運(yùn)行的過程中,把端口號(hào)寫成不同的。 //4.接收數(shù)據(jù) //5.結(jié)束//應(yīng)用程序 端口號(hào) int main(int argc,char**argv) { //1.參數(shù)判斷if(argc < 2){perror("argc error\n");return -1;}//2.建立數(shù)據(jù)報(bào)套接字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.修改數(shù)據(jù)報(bào)套接字的屬性,允許廣播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");//把結(jié)果顯示出來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.綁定:綁定是綁定當(dāng)前cid和當(dāng)前id和地址,本地saddr.sin_family = AF_INET;//核心轉(zhuǎn)儲(chǔ)通常是因?yàn)?少參數(shù)造成的。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.接收發(fā)送端傳來的數(shù)據(jù)char buff[128] = "";int size1 = sizeof(baddr);int len = recvfrom(cid,buff,sizeof(buff)-1,0,(struct sockaddr*)&baddr,&size1);//網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換成主機(jī)字節(jié)序端口號(hào)printf("server port:%d\n",ntohs(saddr.sin_port));printf("recv len = %d\n",len);//網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換成主機(jī)字節(jié)序字符串printf("server addr : %s\n",inet_ntop(AF_INET,&baddr.sin_addr.s_addr,ip,sizeof(ip)));//接收到的內(nèi)容printf("content is : %s\n",buff);//4.關(guān)閉套接字close(cid);}14.程序功能:廣播發(fā)送端
代碼:
#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廣播發(fā)送端編程 //1.建立數(shù)據(jù)報(bào)套接字 //2.修改數(shù)據(jù)報(bào)套接字屬性 //3.發(fā)送端雖然不綁定,但是要編寫要發(fā)送給誰(shuí)的ip,所以,ip地址也要填寫INADDR_BROADCAST //4.發(fā)送 //5.結(jié)束//要聯(lián)網(wǎng)1對(duì)多,應(yīng)用程序 端口號(hào) int main(int argc,char**argv) { //1.參數(shù)判斷if(argc < 2){perror("argc error\n");return -1;}//2.建立數(shù)據(jù)報(bào)套接字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");//把結(jié)果顯示出來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;//發(fā)送給第一個(gè)接受端char *buff = "hello linux";int len = sendto(sid,buff,strlen(buff),0,(struct sockaddr*)&raddr,sizeof(raddr));printf("send len = %d\n",len);//4.關(guān)閉套接字close(sid);}總結(jié)
以上是生活随笔為你收集整理的网络编程 day03 (linux) UDP 协议的传输 与函数 getsockopt setsockopt sendto(经socket传送数据)recvfrom的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: abaqus 批量提取不同积分点的数据
- 下一篇: linux汇编编译器:GAS和NASM的