TCP/IP協議叫做傳輸控制/網際協議,又叫做網絡通信協議。實際上,它包括上百個功能的協議。
套接字(socket):在網絡中用來描述計算機中不同程序與其他計算程序的通信方式。
套接字分為三類;
流式socket(SOCK_STREAM):提供可靠,面向連接的通信流;它使用TCP協議,從而保證了數據傳輸的正確性和順序性。
數據報socket(SOCK_DGRAM):數據報套接字定義了一種無連接的服務,數據通過相互獨立的報文進行傳輸,無序的,並且不保證可靠,無差錯的。它使用的數據報協議是UDP。
原始socket:原始套接字允許對底層協議如TP或ICMP進行直接訪問,它功能強大但使用復雜,主要用於一些協議的開發。
下面是UDP通信的demo:
//socket udp 服務端
1 #include<stdio.h> 2 #include<unistd.h> 3 #include<sys/types.h> 4 #include<sys/socket.h> 5 #include<arpa/inet.h> 6 7 int main() 8 { 9 //創建socket對象 10 int sockfd=socket(AF_INET,SOCK_DGRAM,0); 11 12 //創建網絡通信對象 13 struct sockaddr_in addr; 14 addr.sin_family =AF_INET; 15 addr.sin_port =htons(1324); 16 addr.sin_addr.s_addr=inet_addr("127.0.0.1"); 17 18 //綁定socket對象與通信鏈接 19 int ret =bind(sockfd,(struct sockaddr*)&addr,sizeof(addr)); 20 if(0>ret) 21 { 22 printf("bind\n"); 23 return -1; 24 25 } 26 struct sockaddr_in cli; 27 socklen_t len=sizeof(cli); 28 29 while(1) 30 { 31 char buf =0; 32 recvfrom(sockfd,&buf,sizeof(buf),0,(struct sockaddr*)&cli,&len); 33 printf("recv num =%hhd\n",buf); 34 35 buf =66; 36 sendto(sockfd,&buf,sizeof(buf),0,(struct sockaddr*)&cli,len); 37 38 } 39 close(sockfd); 40 41 }
//socket udp 客戶端
1 #include<stdio.h> 2 #include<sys/types.h> 3 #include<sys/socket.h> 4 #include<unistd.h> 5 #include<arpa/inet.h> 6 7 int main() 8 { 9 //創建socket對象 10 int sockfd=socket(AF_INET,SOCK_DGRAM,0); 11 12 //創建網絡通信對象 13 struct sockaddr_in addr; 14 addr.sin_family =AF_INET; 15 addr.sin_port =htons(1324); 16 addr.sin_addr.s_addr = inet_addr("192.168.0.143"); 17 18 while(1) 19 { 20 printf("請輸入一個數字:"); 21 char buf=0; 22 scanf("%hhd",&buf); 23 sendto(sockfd,&buf, 24 sizeof(buf),0,(struct sockaddr*)&addr,sizeof(addr)); 25 26 socklen_t len=sizeof(addr); 27 recvfrom(sockfd,&buf,sizeof(buf),0,(struct sockaddr*)&addr,&len); 28 29 if(66 ==buf) 30 { 31 printf(" server 成功接受\n"); 32 } 33 else 34 { 35 printf("server 數據丟失\n"); 36 } 37 38 } 39 close(sockfd); 40 41 }