UDP服务器、客户端的简单实现

TCP协议和UDP协议的区别:
TCP:面向连接,传输可靠(保证数据正确性,保证数据顺序),用于传输大量数据(流模式),速度慢,建立连接需要开销较多。
UDP:面向非连接,传输不可靠,用于传输少量数据(数据包模式),速度快。


UDP协议的搭建流程

---------------------------UDP通信接收端-----------------------------------
1.创建socket  
头文件:
      #include <sys/types.h>          /* See NOTES */
      #include <sys/socket.h>
函数原型:
       int socket(int domain, int type, int protocol);
参数一:IP协议          AF_INET             IPv4 Internet protocols          ip(7)
                            AF_INET6            IPv6 Internet protocols          ipv6(7)
                                     AF_IPX              IPX - Novell protocols
参数二:传输协议       SOCK_STREAM    ---》TCP协议
                       SOCK_DGRAM    ---》UDP协议
参数三:socket的属性    填写为0 默认属性
返回值:成功发回 新的socket文件描述符 , 失败返回  -1

2.绑定socket
头文件:
          #include <sys/types.h>          /* See NOTES */
        #include <sys/socket.h>
函数原型:
           int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
参数一:创建的socket文件描述符
参数二:服务器绑定信息
参数三:服务器信息结构体的大小
返回值:成功返回0 ,失败返回-1


3.接收函数
    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);

   参数一:socket文件描述符
   参数二: 接收缓存区  
   参数三:接收数据的大小 
   参数四:接收函数的属性   0默认属性   
   参数五:保存发送方的IP信息 
   参数六:成功获取对方信息的大小



---------------------------UDP通信发送端-----------------------------------
1.创建socket  
头文件:
      #include <sys/types.h>          /* See NOTES */
      #include <sys/socket.h>
函数原型:
       int socket(int domain, int type, int protocol);
参数一:IP协议          AF_INET             IPv4 Internet protocols          ip(7)
                            AF_INET6            IPv6 Internet protocols          ipv6(7)
                                     AF_IPX              IPX - Novell protocols
参数二:传输协议       SOCK_STREAM    ---》TCP协议
                       SOCK_DGRAM    ---》UDP协议
参数三:socket的属性    填写为0 默认属性
返回值:成功发回 新的socket文件描述符 , 失败返回  -1

2.发送函数
 ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);

   参数一:socket文件描述符
   参数二: 发送缓存区  
   参数三:发送数据的大小 
   参数四:发送函数的属性   0默认属性   
   参数五:接收方的IP信息   
   参数六:IP信息结构体的大小

-----------------------------------------------------------------------------------------------------------------------
练习:udp服务器和客户端的简单通信实现
【udprecv.c】
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>

int main(int argv,char **argc)
{
		//创建socket
       int sockfd = socket(AF_INET,SOCK_DGRAM,0);
	  if(sockfd<0)
	  {
		perror("create sock fail\n");
      }
	  //设置接收端信息
	   struct sockaddr_in  addr;
	   bzero(&addr,sizeof(addr));
	   addr.sin_family = AF_INET;
	   addr.sin_port   =  htons(atoi(argc[1]));
	   addr.sin_addr.s_addr = inet_addr("0.0.0.0");//0.0.0.0为万能地址,可自动匹配IP
	   //绑定接收端信息
	  char buf[100]={0};
	  int ret = bind(sockfd,(struct sockaddr *)&addr,sizeof(addr));
	  if(ret < 0)
		perror("bind fail:");
	
	  //接收UDP数据包
	  struct sockaddr_in  client_addr;
	  bzero(&client_addr,sizeof(client_addr));
	  int len = sizeof(client_addr);
	  while(1)
	  {
		ssize_t  ret = recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&client_addr,&len);
		if(ret < 0)
			perror("error:");
		else
		printf("buf = %s\n",buf);
	  }
	  close(sockfd);
	  
}


-----------------------------------------------------------------------------------------------------------------------
【udpsend.c】
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 #include <unistd.h>
#include <stdio.h>
int main(int argv,char **argc)
{
		//创建socket
       int sockfd=socket(AF_INET,SOCK_DGRAM,0);
	  if(sockfd<0)
	  {
		perror("create sock fail\n");
      }
	  //设置接收端的信息
	   struct sockaddr_in  addr;
	   bzero(&addr,sizeof(addr));
	   addr.sin_family = AF_INET;
	   addr.sin_port   =  htons(atoi(argc[1]));
	   addr.sin_addr.s_addr = inet_addr(argc[2]);
	  
	  char buf[10]={"udpdate"};
	  int ret=0;
	  //发送UDP数据包
	  while(1)
	  {
	 ret=sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&addr,sizeof(addr));
	 if(ret>0)
	 {
		printf("buf=%s\tsize=%d\n",buf,ret);
	 }
	  sleep(1);
	  }
	  
	  close(sockfd);
	  
}


-----------------------------------------------------------------------------------------------------------------------
程序运行时必须 先运行服务器程序再运行客户端程序,并且设置端口和服务器ip地址



猜你喜欢

转载自blog.csdn.net/sinat_39061823/article/details/76795928