问题:
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);
}