UDP 通信例程

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <strings.h>
#include <sys/wait.h>
#include <errno.h>
#include <string.h>
#include <time.h>
int main(int argc,char *argv[])
{

    int sockfd,ret;
    struct sockaddr_in serveraddr,clientaddr;
    time_t timep;

    char recvbuf[1024],buf[120];
    sockfd=socket(AF_INET,SOCK_DGRAM,0);

    socklen_t client_len;
    if(sockfd<0)
    {
        perror("socket error");
        return -1;
    }
    bzero((struct sockaddr*)&serveraddr,sizeof(serveraddr));
    serveraddr.sin_family=AF_INET;
    serveraddr.sin_addr.s_addr=htons(INADDR_ANY);
    serveraddr.sin_port=htons(8888);
    ret=bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr));
    if(ret<0)
    {
        perror("bind error");
        return -1;
    }
    while(1)
    {
	printf("recvfrom ready\n ");
        ret=recvfrom(sockfd,recvbuf,1024,0,(struct sockaddr*)&clientaddr,&client_len);
        if(ret<0)
        {
            perror("recvfrom error \n");
            close(sockfd);
            
            return -1;
        }
       printf("recvfrom ok\n");
        printf("recvfrom:%s\n",recvbuf);

        //timep=time(NULL);
       // snprintf(buf,sizeof(buf),"%s",ctime(&timep));


        sendto(sockfd,recvbuf,strlen(recvbuf),0,(struct sockaddr*)&clientaddr,sizeof(clientaddr));
        bzero((struct sockaddr*)&clientaddr,client_len);
        bzero(buf,120);
        bzero(recvbuf,1024);

    }

    close(sockfd);
    return 0;
}

客户端

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
 #include <time.h>
 
int main()
{
    /*1 创建socket*/
    int socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
    struct sockaddr_in addr;
     socklen_t len ;
    
    char buff[512];
    
    if(socket_fd == -1)
    {
        perror("udp_socket创建失败!退出客户端系统");
        exit(-1);
    }
 
    /*2 准备地址:需要设计一个地址结构体用于存储sock地址结构 addr 的数据*/
   //设置family地址格式类型
   addr.sin_family = AF_INET;
 
   /*绑定地址和端口;
    * htons是一个转换函数,因为操作系统中的字节排序和网络中字节排序中的字节流顺序是不统一的,所以在进行由系统转化为网络传送。
    *  htons->host to net short 由主机转换为网络顺序。
    */
   addr.sin_port = htons(8888);
   addr.sin_addr.s_addr = inet_addr("127.0.0.1");
   if (addr.sin_addr.s_addr == INADDR_NONE)
       {
           printf("Incorrect ip address!");
           close(socket_fd);
           exit(1);
       }
 
   /*3 进行通信*/
    len = sizeof(addr);
   while (1)
       {
           fgets(buff,512,stdin);
           int n;
           //addr是sockaddr_in类型需要进行强制类型转换
           n = sendto(socket_fd, buff, strlen(buff), 0, (struct sockaddr *)&addr, sizeof(addr));
           if (n < 0)//发送了n个字节
           {
               perror("sendto");
               close(socket_fd);
               break;
           }
           memset(buff,0,sizeof (buff));
           n = recvfrom(socket_fd, buff, 512, 0, (struct sockaddr *)&addr, &len);
           if (n>0)
           {
               buff[n] = 0;
               printf("received:");
               puts(buff);
           }
          
           else if (n == -1)
           {
               perror("recvfrom");
               close(socket_fd);
               break;
           }
       }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值