1. 程式人生 > >套接字編程(UDP)

套接字編程(UDP)

play exc 個數 eval exit include protocol pri one

技術分享
  1 #include<sys/socket.h>
  2 #include<sys/types.h>
  3 #include<stdio.h>
  4 #include<netinet/in.h>
  5 #include<arpa/inet.h>
  6 #include<errno.h>
  7 #include<string.h>
  8 #include<stdlib.h>
  9 #include<unistd.h>
 10 #include <sys/time.h>
 11
#include <sys/types.h> 12 #include <unistd.h> 13 int main(int argc,char ** argv) 14 { 15 int listenfd; 16 17 listenfd=socket(AF_INET,SOCK_STREAM,0); 18 struct sockaddr_in myaddr; 19 myaddr.sin_family=AF_INET; 20 myaddr.sin_port=htons(atoi(argv[1])); 21 inet_pton(AF_INET,"
192.168.6.11",&myaddr.sin_addr.s_addr); 22 23 int ret=bind(listenfd,(struct sockaddr *)&myaddr,sizeof(myaddr)); 24 if(ret<0) 25 { 26 perror("bind failed:"); 27 exit(0); 28 } 29 ret=listen(listenfd,20); 30 if(ret<0) 31 { 32 perror("
listen failed:"); 33 exit(0); 34 } 35 struct sockaddr_in caddr; 36 int len=sizeof(caddr); 37 int confd; 38 char buf[100]; 39 40 fd_set set,rset;//定義一個文件描述符集合 41 FD_ZERO(&set);//清空文件描述符集合 42 FD_SET(listenfd,&set);//將文件描述符添加到集合裏面去 43 44 int maxfd=listenfd; 45 /* 46 int select(int nfds, fd_set *readfds, fd_set *writefds, 47 fd_set *exceptfds, struct timeval *timeout); 48 49 第一個參數:是你要監聽的最大文件描述符+1 50 返回值:如果有事件產生,返回的事件的個數.如果返回值為0,表示超時等待,出錯返回負數 51 */ 52 53 int nfound; 54 while(1) 55 { 56 rset=set; 57 nfound=select(maxfd+1,&rset,NULL,NULL,NULL); 58 printf("nfound=%d\n",nfound); 59 if(nfound<0) 60 { 61 perror("select error"); 62 continue; 63 } 64 else if(nfound==0) 65 { 66 printf("超時等待..\n"); 67 continue; 68 } 69 if(FD_ISSET(listenfd,&rset))//FD_ISSET 判斷文件描述符是否有事件產生,有返回真,沒有返回假 70 { 71 printf("accept\n"); 72 confd=accept(listenfd,(struct sockaddr*)&caddr,&len); 73 if(confd<0) 74 { 75 perror("accept failed:"); 76 continue; 77 } 78 FD_SET(confd,&set); 79 if(confd>maxfd) 80 maxfd=confd; 81 FD_CLR(listenfd,&rset);//將監聽的文件描述符集合中移除. 82 } 83 for(int fd=0;fd<=maxfd;fd++) 84 { 85 if(fd==listenfd) 86 continue; 87 if(!FD_ISSET(fd,&rset)) 88 continue; 89 ret=read(fd,buf,100); 90 if(ret<0) 91 { 92 FD_CLR(fd,&set);//將監聽的文件描述符集合中移除. 93 close(fd); 94 perror("read failed:"); 95 continue; 96 } 97 else if(ret==0) 98 { 99 printf("client closed\n"); 100 FD_CLR(fd,&set);//將監聽的文件描述符集合中移除. 101 close(fd); 102 continue; 103 } 104 else 105 { 106 printf("ret=%d buf=%s\n",ret,buf); 107 } 108 } 109 } 110 }
server.c 技術分享
 1 #include<sys/socket.h>
 2 #include<sys/types.h>
 3 #include<stdio.h>
 4 #include<netinet/in.h>
 5 #include<arpa/inet.h>
 6 #include<errno.h>
 7 #include<string.h>
 8 #include<stdlib.h>
 9 #include<unistd.h>
10 int main(int argc,char ** argv)
11 {
12 //int socket(int domain, int type, int protocol);
13     int sockfd;
14     sockfd=socket(AF_INET,SOCK_STREAM,0);
15     printf("sockfd=%d\n",sockfd);
16 
17 /*
18    int  connect(int sockfd, struct sockaddr *serv_addr, int addrlen );
19     作用:向服務器請求三次握手
20     參數1:套接字
21     參數2:服務端的地址族結構,也就是地址類型,IP,端口
22     參數3:服務端地址族的大小
23     返回值:成功則返回非負數
24  */
25 
26    struct sockaddr_in seraddr;
27     seraddr.sin_family=AF_INET;
28     seraddr.sin_port=htons(atoi(argv[1]));
29     inet_pton(AF_INET,"192.168.6.11",&seraddr.sin_addr.s_addr);
30 
31     int ret=connect(sockfd,(struct sockaddr *)&seraddr,sizeof(seraddr));
32     if(ret<0)
33     {
34         perror("connect failed:");
35         exit(0);
36     }
37     char buf[20];
38     scanf("%s",buf);
39     write(sockfd,buf,strlen(buf)+1);
40     close(sockfd);
41 
42     return 0;
43 }
client.c

gcc ./server ./client 效果如下技術分享

套接字編程(UDP)