2022-10-20

该代码示例展示了使用C语言实现的UDP通信客户端和服务端。客户端连接到指定IP和端口,接收并回复服务器的数据。服务端则等待用户输入,将输入发送给客户端,并接收客户端的回应。程序通过`socket`、`bind`、`recvfrom`和`sendto`等函数实现了数据的双向传输。
摘要由CSDN通过智能技术生成
// main.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8000
#define IP "192.168.126.140"
#define PRINT_ERR(msg) \
   do                  \
   {                   \
      perror(msg);     \
      return -1;       \
   } while (0)

int main(int argc, const char *argv[])
{
   int sfd = socket(AF_INET, SOCK_DGRAM, 0);
   if (-1 == sfd)
      PRINT_ERR("socket");

   struct sockaddr_in sin;
   sin.sin_family = AF_INET;
   sin.sin_addr.s_addr = inet_addr(IP);
   sin.sin_port = htons(PORT);

   if (bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
      PRINT_ERR("bind");
   else
      printf("链接成功\n");
   char buff[100];
   struct sockaddr_in cin;
   socklen_t cin_len = sizeof(cin);
   int res;
   while (1)
   {
      res = recvfrom(sfd, buff, sizeof(buff), 0, (struct sockaddr *)&cin, &cin_len);
      if (res < 0)
         PRINT_ERR("recvfrom");
      buff[res] = '\0';
      printf("%s", buff);
      printf("input 》》");
      fgets(buff, sizeof(buff), stdin);
      res = sendto(sfd, buff, sizeof(buff), 0, (struct sockaddr *)&cin, cin_len);
      if (0 > res)
         PRINT_ERR("sendto");
   }
   close(sfd);
   return 0;
}
// server.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8000
#define IP "192.168.126.140"
#define PRINT_ERR(msg) \
   do                  \
   {                   \
      perror(msg);     \
      return -1;       \
   } while (0)

int main(int argc, const char *argv[])
{
   int sfd = socket(AF_INET, SOCK_DGRAM, 0);
   if (-1 == sfd)
      PRINT_ERR("socket");
   
   struct sockaddr_in sin;
   sin.sin_family = AF_INET;
   sin.sin_addr.s_addr = inet_addr(IP);
   sin.sin_port = htons(PORT);

//    if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin)) < 0)
//       PRINT_ERR("bind");
//    else printf("链接成功\n");
   char buff[100];
   struct sockaddr_in cin;
   socklen_t cin_len = sizeof(cin);
   int res;
   while(1)
   {
      printf("input 》》");
      fgets(buff,sizeof(buff),stdin);
      res = sendto(sfd,buff,sizeof(buff),0,(struct sockaddr *)&sin,sizeof(sin));
      if(0 > res)
         PRINT_ERR("sendto");

      res = recvfrom(sfd,buff,sizeof(buff),0,(struct sockaddr *)&cin,&cin_len);
      if( res < 0) 
         PRINT_ERR("recvfrom");
      buff[res] = '\0';
      printf("%s",buff);
   }
   close(sfd);
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值