Linux 网络编程-udp

问题:

1.混淆了strlen和sizeof的用法

在server.c中接收(strlen报错)

recvfrom(sockfd,buffer,strlen(buffer),0,(struct sockaddr*)&cli,&len);

在cilient.c中(不报错)

sendto(sockfd,buffer,strlen(buffer),0,(struct sockaddr*)&addr,sizeof(addr));

 

 接收不到数据

接收函数使用

strlen是查找一个字符串中的\0结尾符号。并计算从这个符号算前面的字符数。

而recvfrom函数的第三个参数说明是  读N个字节读进buf中
                                              N为你要接收数据的缓冲区长度。

在recvfrom中,buffer还没有开始接收数据。所以里面应该是空的。strlen()为0。所以你strlen得到的缓冲区长度为0。
那么,当有数据到来时,recvfrom就会认为你的缓冲区没有空间,自然会报错。接收不到数据

cilient 不会报错是因为 sendto之前,buffer中已经有数据了 ,所以strlen为数据长度。

server.c 

//socket udp 服务端 1 #include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<string.h>
int main()
{
     //创建socket对象
     int sockfd=socket(AF_INET,SOCK_DGRAM,0);
 
     //创建网络通信对象
     struct sockaddr_in addr;
     addr.sin_family =AF_INET;//协议簇 AF_INET为标准tcp/ip协议
     addr.sin_port =htons(1324);
     addr.sin_addr.s_addr=inet_addr("127.0.0.1");

     //绑定socket对象与通信链接
     int ret =bind(sockfd,(struct sockaddr*)&addr,sizeof(addr));
     if(0>ret)
     {
         printf("bind\n");
         return -1;
 
     }
     struct sockaddr_in cli;
     socklen_t len=sizeof(cli);
 
     while(1)
     {
        
         char buffer[128];
         char ipv4_addr[16];
         int buf =66;
         printf(" sizeof %ld\r\n",sizeof(buffer));
         printf(" strlen %ld\r\n",strlen(buffer));
         recvfrom(sockfd,buffer,sizeof(buffer),0,(struct sockaddr*)&cli,&len);
         printf("recv num =%s\n",buffer);
         //打印ip地址和端口号,利用函数将标准文本文件转为二进制文件
         
          if(!inet_ntop(AF_INET,(void*)&addr.sin_addr,ipv4_addr,sizeof(ipv4_addr)))
          {
            printf("error");
          }
          printf("recv from(%s:%d),data\r\n",ipv4_addr,ntohs(addr.sin_port));
          
          
 
         
         sendto(sockfd,&buf,sizeof(buf),0,(struct sockaddr*)&cli,len);
         
 
     }
     close(sockfd);
 
}

cilient.c

//socket udp 客户端 1 #include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<arpa/inet.h>
 #include <stdio.h>
 #include<string.h>
int main()
{
     //创建socket对象
     int sockfd=socket(AF_INET,SOCK_DGRAM,0);
 
     //创建网络通信对象
     struct sockaddr_in addr;
     addr.sin_family =AF_INET;
     addr.sin_port =htons(1324);
     addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //IP根据server所在主机的IP设定,这里是运行在同一PC端 
 
     while(1)
     {
         printf("请输入一个数字:");
       
         char buffer[128];
         char buf=0;
         //scanf("%s",buffer);
         fgets(buffer,127,stdin);
         
         sendto(sockfd,buffer,strlen(buffer),0,(struct sockaddr*)&addr,sizeof(addr));
 
         socklen_t len=sizeof(addr);
         recvfrom(sockfd,&buf,sizeof(buf),0,(struct sockaddr*)&addr,&len);
 
         if(66==buf)
         {
            printf(" server 成功接受\n");
         }
         else
         {
             printf("server 数据丢失\n");
         }
 
     }
     close(sockfd); 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值