udp的socket数据传输

本文详细介绍了TCP和UDP两种网络传输协议的特点与区别,包括TCP的可靠性和UDP的高效性。并通过示例代码展示了如何使用这两种协议进行数据交换。

在网络传输协议中,TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接。TCP有一种“重传确认”机制,即接收端收到数据后要发出一个肯定确认的信号,发送端如果收到接收端肯定确认的信号,就会继续发送其他的数据,如果没有,它就会重新发送。

相对而言,UDP协议则是一种无连接的,不可靠的数据报(SOCK_DGRAM)传输服务。使用UDP套接口不用建立连接,服务端在调用socket()生成一个套接字并调用bind()绑定端口后就可以进行通信(recvfrom函数和sendto函数)了;客户端在用socket()生成一个套接字后就可以向服务端地址发送和接收数据了。

此处需要特别注意:TCP使用的是流套接字(SOCK_STREAM),UDP使用的是数据报套接字(SOCK_DGRAM)


关于socket的配置:

        1、创建sokcet套接字

       2、为创建的socket绑定地址与端口,指定传输的协议,一般采用AF_INET,数据的传输格式一般为(SOCK_STREAM、SOCK_DGRAM)

        3、打开文件标识符,并开始发送数据

udp客户端CODE:

[cpp]  view plain  copy
  1. <pre name="code" class="html">#include <unistd.h>  
  2. #include <sys/types.h>  
  3. #include <netinet/in.h>  
  4. #include <arpa/inet.h>  
  5. #include <stdlib.h>  
  6. #include <stdio.h>  
  7. #include <errno.h>  
  8. #include <string.h>  
  9.       
  10. void client(int sock){  
  11.     //2、设置客户端socket参数  
  12.     struct sockaddr_in servaddr;  
  13.     memset(&servaddr, 0, sizeof(servaddr));  
  14.     //3、设置传输协议、端口以及目的地址  
  15.     servaddr.sin_family = AF_INET;  
  16.     servaddr.sin_port = htons(5188);  
  17.     servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");  
  18.   
  19.     //4、创建发送与接收缓存字节数组  
  20.     int ret;  
  21.     char sendbuf[1024] = {0};  
  22.     char recvbuf[1024] = {0};  
  23.     //5、开始发送数据(此处是发送来自标准输入的数据)  
  24.     while(fgets(sendbuf, sizeof(sendbuf), stdin) != NULL){  
  25.         sendto(sock, sendbuf, strlen(sendbuf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr));  
  26.         //6、开始接收数据,接收服务端返回的数据  
  27.         ret = recvfrom(sock, recvbuf, sizeof(recvbuf), 0, NULL, NULL);  
  28.         if(ret == -1){  
  29.             perror("recvfrom");  
  30.             exit(EXIT_FAILURE);  
  31.         }  
  32.   
  33.         //fputs(recvbuf, stdout);       //将服务端返回的数据写入到标准输出  
  34.           
  35.         //7、清空发送与接收缓存  
  36.         memset(sendbuf, 0, sizeof(sendbuf));  
  37.         memset(recvbuf, 0, sizeof(recvbuf));  
  38.     }  
  39.     //8、关闭socket流  
  40.     close(sock);  
  41. }  
  42.   
  43. int main(void){  
  44.     int sock;  
  45.     //1.创建客户端的socket  
  46.     if((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0){  
  47.         perror("socket");  
  48.         exit(EXIT_FAILURE);  
  49.     }  
  50.     client(sock);  
  51.     return 0;  
  52. }  


 

UDP服务端CODE:

 
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <unistd.h>  
  4. #include <errno.h>  
  5. #include <sys/types.h>  
  6. #include <sys/socket.h>  
  7. #include <netinet/in.h>  
  8. #include <string.h>  
  9.   
  10. void server(int sock){  
  11.     //1、建立接收缓存字节数组  
  12.     char recvbuf[1024] = {0};  
  13.     //2、定义socket  
  14.     struct sockaddr_in peeraddr;  
  15.     socklen_t peerlen;  
  16.     int n;  
  17.     while(1){  
  18.         //  
  19.         peerlen = sizeof(peeraddr);  
  20.         //3、清空接收缓存数组  
  21.         memset(recvbuf, 0, sizeof(recvbuf));  
  22.         //4、开始接收数据  
  23.         n = recvfrom(sock, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&peeraddr, &peerlen);  
  24.         //5、判断是否接收完整数据  
  25.         if(n == -1){  
  26.                 perror("recvfrom");   
  27.                 exit(EXIT_FAILURE);   
  28.         }else if(n > 0){  
  29.             //6、成功接收数据,将缓存数据写入到标准输出,打印到控制台  
  30.             fputs(recvbuf, stdout);  
  31.             //7、想客户端回送接收到的数据(回显客户端输入的数据)  
  32.             sendto(sock, recvbuf, n, 0, (struct sockaddr *)&peeraddr, peerlen);  
  33.         }  
  34.     }  
  35.     //关闭socket  
  36.     close(sock);  
  37. }  
  38.   
  39. int main(void){  
  40.         int sock;  
  41.         //创建服务器socket  
  42.         if((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0){  
  43.             perror("socket error");  
  44.             exit(EXIT_FAILURE);  
  45.         }  
  46.         //设置服务器socket参数  
  47.         struct sockaddr_in servaddr;  
  48.         memset(&servaddr, 0, sizeof(servaddr));  
  49.         //设置socket的协议、端口以及地址  
  50.         servaddr.sin_family = AF_INET;  
  51.         servaddr.sin_port = htons(5188);  
  52.         servaddr.sin_addr.s_addr = htonl(INADDR_ANY);  
  53.       
  54.         //将socket绑定地址  
  55.         if(bind(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){  
  56.             perror("bind error");  
  57.             exit(EXIT_FAILURE);  
  58.         }  
  59.         server(sock);  
  60.         return 0;  
  61. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值