從本次博客開始,本人開始展現在學習unix網絡編程過程當中實現的程序。unix網絡編程不會教讀者作具體的網絡編程項目,而是教讀者理解網絡編程。《計算機網絡》這本書僅僅是在講計算機網絡的一些基本概念,《linux程序設計》這本書是在將一些linux系統調用,其中包含一部分socket接口,可是僅僅是將一些api的用法,並無講解每個系統調用背後包含的《計算機網絡》的理論知識。而《unix網絡編程》則是將linux系統和調用和計算機網絡的理論知識結合起來說,讀者讀了十分清楚。《unix網絡編程》在講解一些代碼示例的時候討論了在網絡編程中所需考慮的其餘的問題,好比進程、信號、線程等等,在代碼中給出了恰當的解決方案。讀者在模型的基礎上加以修改,就能寫出一個基於網絡編程demo。不得不說,《unix網絡編程》是一本理論和實踐相結合的好書。linux
第一個實例是一個獲取時間的程序,使用tcp鏈接通信。編程
服務端代碼:api
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <sys/socket.h> 4 #include <sys/types.h> 5 #include <arpa/inet.h> 6 #include <netinet/in.h> 7 #include <strings.h> 8 #include <string.h> 9 #include <unistd.h> 10 #include <errno.h> 11 #include <time.h> 12 13 #define MAXLINE 4095 14 15 int main () 16 { 17 int listenfd,connfd; 18 struct sockaddr_in servaddr,cliaddr; 19 char buf[4095]; 20 time_t ticks; 21 22 /*create a socket*/ 23 if ((listenfd = socket (AF_INET,SOCK_STREAM,0)) < 0) { 24 perror ("socket"); 25 exit (1); 26 } 27 28 bzero (&servaddr,sizeof (servaddr)); 29 bzero (&cliaddr,sizeof (cliaddr)); 30 31 /*set ip information*/ 32 servaddr.sin_family = AF_INET; 33 servaddr.sin_port = htons (9347); 34 servaddr.sin_addr.s_addr = htonl (INADDR_ANY); 35 36 if ( (bind (listenfd, 37 (struct sockaddr *) &servaddr, 38 sizeof (servaddr))) < 0) { 39 perror ("bind"); 40 exit (1); 41 } 42 43 listen (listenfd,20); 44 while (1) { 45 int len = sizeof (cliaddr); 46 connfd = accept (listenfd,(struct sockaddr*)&cliaddr,&len); 47 if (connfd < 0) { 48 perror ("accept"); 49 exit (1); 50 } 51 52 printf ("a client has connected\n"); 53 54 ticks = time (NULL); 55 snprintf (buf,sizeof (buf),"%.24s\r\n",ctime (&ticks)); 56 write (connfd,buf,strlen (buf)); 57 close (connfd); 58 } 59 60 return 0; 61 }
客戶端代碼:網絡
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <sys/socket.h> 4 #include <sys/types.h> 5 #include <arpa/inet.h> 6 #include <netinet/in.h> 7 #include <strings.h> 8 #include <unistd.h> 9 #include <errno.h> 10 11 #define MAXLINE 4095 12 int main () 13 { 14 int sockfd; 15 int n; 16 char recvline[MAXLINE + 1]; 17 struct sockaddr_in serveraddr; 18 19 /*create a socket*/ 20 if ((sockfd = socket (AF_INET,SOCK_STREAM,0)) < 0) { 21 perror ("socket"); 22 exit (1); 23 } 24 25 bzero (&serveraddr,sizeof (serveraddr)); 26 27 /*set ip and port information*/ 28 serveraddr.sin_family = AF_INET; 29 serveraddr.sin_port = htons (9347); 30 if (inet_pton (AF_INET,"115.28.75.192",&serveraddr.sin_addr) < 0) { 31 perror ("inet_pton"); 32 exit (1); 33 } 34 35 if (connect (sockfd, 36 (struct sockaddr*) &serveraddr, 37 sizeof (serveraddr)) < 0) { 38 39 perror ("connect"); 40 exit (1); 41 } 42 43 while ((n = read (sockfd,recvline,MAXLINE)) > 0) { 44 recvline[n] = '\0'; 45 printf ("%s\n",recvline); 46 } 47 48 if (n < 0) { 49 printf ("read error\n"); 50 } 51 52 exit (0); 53 }
剛剛接觸網絡編程,代碼中有不少不完善的地方,請多指教。socket