0基础学会 UDP通信(内附C语言源码)

#include <sys/types.h>            
#include <sys/socket.h>
ssize_t sendto(int socketfd,const void* buf,size_t len,int flags,const struct sockaddr *dest_addr,socklen_t addrlen);
    -参数:
        -sockfd:通信后的fd
        -buf:要发送的数据
        -len:发送数据的长度
        -flags:0
        -dest_addr:通信的另外一端的地址信息
        -addrlen:地址的内存大小
ssize_t recvfrom(int sockfd,void *buf,size_t len,int flags,struct sockaddr *src_addr,socklen_t *addrlen);
    -参数:
        -sockfd:通信的fd
        -buf:接收数据的数据
        -len:数据的大小
        -flags:0
        -src_addr:用来保存另外一端的地址信息,不需要可以指定为NULL
        -addrlen:地址的内存大小

相关的代码是实现为:

服务器端

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <unistd.h>
  4 #include <string.h>
  5 #include <arpa/inet.h>
  6 int main()
  7 {
  8         //1、创建一个socket
  9         int fd=socket(AF_INET,SOCK_DGRAM,0);
 10         if(fd==-1)
 11         {
 12                 perror("socket");
 13                 exit(-1);
 14         }
 15         //2、绑定
 16         struct sockaddr_in saddr;
 17         saddr.sin_family=AF_INET;
 18         saddr.sin_port=htons(9999);
 19         saddr.sin_addr.s_addr=INADDR_ANY;
 20         int ret=bind(fd,(struct sockaddr*)&saddr,sizeof(saddr));
 21         if(ret==-1)
 22         {
 23                 perror("bind");
 24                 exit(-1);
 25         }
 26         //3、通信
 27         while(1)
 28         {
 29                 char recvbuf[128];
 30                 char ipbuf[16];
 31                 struct sockaddr_in cliaddr;
 32                 int len=sizeof(cliaddr);
 33                 //接收数据
 34                 int num=recvfrom(fd,recvbuf,sizeof(recvbuf),0,(struct sockaddr*)&cliaddr,&len);
 35                 if(num==-1)
 36                 {
 37                         perror("recvfrom");
 38                         exit(-1);
 39                 }
 40                 printf("client IP:%s,Port:%d\n",inet_ntop(AF_INET,&cliaddr.sin_addr.s_addr,ipbuf,sizeof(ipbuf)),ntohs(cliaddr.sin_port));
 41 
 42                 printf("client say:%s\n",recvbuf);
 43                 //发送数据
 44                 sendto(fd,recvbuf,strlen(recvbuf)+1,0,(struct sockaddr*)&cliaddr,sizeof(cliaddr));
 45         }
 46         close(fd);
 47         return 0;
 48 }

客户端

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <unistd.h>
  4 #include <string.h>
  5 #include <arpa/inet.h>
  6 int main()
  7 {
  8         //1、socket
  9         int fd=socket(AF_INET,SOCK_DGRAM,0);
 10         //2、通信
 11         struct sockaddr_in saddr;
 12         saddr.sin_family=AF_INET;
 13         saddr.sin_port=htons(9999);
 14         inet_pton(AF_INET,"192.168.17.134",&saddr.sin_addr.s_addr);
 15         int num=0;
 16         while(1)
 17         {
 18                 char sendbuf[128];
 19                 sprintf(sendbuf,"hello,i am shirui %d\n",num++);
 20                 struct sockaddr_in cliaddr;
 21                 int len=sizeof(cliaddr);
 22                 //2、发送数据
 23                 sendto(fd,&sendbuf,strlen(sendbuf)+1,0,(struct sockaddr*)&saddr,sizeof(saddr));
 24                 //3、接收数据
 25                 recvfrom(fd,&sendbuf,sizeof(sendbuf),0,NULL,NULL);
 26                 printf("server say:%s\n",sendbuf);
 27                 sleep(1);
 28         }
 29         close(fd);
 30         return 0;
 31 }
 32 

 

  

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、面向数据报的网络传输协议,它与TCP相对应。与TCP不同的是,UDP不提供数据的可靠性、顺序性和流量控制。 UDP适用于一些对数据传输时间要求较高的应用,如音视频实时传输、实时游戏、网络广播等。它的特点是传输速度快、协议开销小,适合在网络上快速传输大量数据。 使用UDP协议进行通信时,数据被分割成报文,每个报文都带有一个目的端口号和源端口号。这样的设计使得UDP在网络层面上能够将数据准确快速地传输到指定的端口。由于UDP没有建立连接和断开连接的开销,因此它的处理速度比TCP更快。同时,UDP以数据报的形式发送和接收数据,可以进行多播和广播,可以在同一端口接收多个客户端的请求。 在C语言中,通过使用Socket编程,可以实现UDP通信。在UDP程序中,需要创建一个UDP套接字,绑定端口号,设置服务器和客户端的IP地址和端口号,然后通过sendto()函数发送数据报,通过recvfrom()函数接收数据报。在这个过程中,不需要建立连接和维护状态,只需要通过发送和接收数据报来实现通信UDP协议的简单性和高效性使得它在某些特定的应用场景中得到广泛应用。但是,由于UDP不提供数据可靠性的保证,因此需要在应用层面上来处理数据的丢失和顺序问题。同时,在网络拥塞的情况下,UDP的性能可能会受到影响。 总的来说,UDP是一种面向数据报的协议,适用于一些对实时性要求较高的应用场景,它的简单性和高效性使得它成为了一种重要的网络传输协议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值