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
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Linux虚拟机上实现C语言UDP通信,你需要遵循以下步骤: 1. 安装必要的软件包:在Linux虚拟机上安装必要的软件包,包括gcc、g++、make和libc-dev。 2. 编写UDP服务器代码:使用C语言编写UDP服务器代码并保存为server.c。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 8080 #define BUFFER_SIZE 1024 int main() { int sockfd; struct sockaddr_in server_addr, client_addr; char buffer[BUFFER_SIZE]; sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket creation failed"); exit(EXIT_FAILURE); } memset(&server_addr, 0, sizeof(server_addr)); memset(&client_addr, 0, sizeof(client_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(PORT); if (bind(sockfd, (const struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } int len, n; len = sizeof(client_addr); n = recvfrom(sockfd, (char*)buffer, BUFFER_SIZE, MSG_WAITALL, (struct sockaddr*)&client_addr, &len); buffer[n] = '\0'; printf("Client : %s\n", buffer); sendto(sockfd, (const char*)buffer, strlen(buffer), MSG_CONFIRM, (const struct sockaddr*)&client_addr, len); printf("Message sent to the client.\n"); return 0; } ``` 3. 编译UDP服务器代码:使用以下命令将server.c编译为可执行文件server。 ``` gcc server.c -o server ``` 4. 编写UDP客户端代码:使用C语言编写UDP客户端代码并保存为client.c。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 8080 #define BUFFER_SIZE 1024 int main() { int sockfd; struct sockaddr_in server_addr; char buffer[BUFFER_SIZE]; sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket creation failed"); exit(EXIT_FAILURE); } memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); server_addr.sin_addr.s_addr = INADDR_ANY; int n, len; printf("Enter message to send : "); fgets(buffer, BUFFER_SIZE, stdin); sendto(sockfd, (const char*)buffer, strlen(buffer), MSG_CONFIRM, (const struct sockaddr*)&server_addr, sizeof(server_addr)); printf("Message sent to the server.\n"); n = recvfrom(sockfd, (char*)buffer, BUFFER_SIZE, MSG_WAITALL, (struct sockaddr*)&server_addr, &len); buffer[n] = '\0'; printf("Server : %s\n", buffer); close(sockfd); return 0; } ``` 5. 编译UDP客户端代码:使用以下命令将client.c编译为可执行文件client。 ``` gcc client.c -o client ``` 6. 运行代码:在虚拟机上运行UDP服务器代码和UDP客户端代码。首先,运行UDP服务器。 ``` ./server ``` 然后在另一个终端中运行UDP客户端。 ``` ./client ``` 输入要发送的消息,然后等待服务器的响应。 这样,你就可以在Linux虚拟机上使用C语言实现UDP通信了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值