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 }