udp socket 协议问题,大家帮我找找原因,出现的错误是 recv: Bad address

weiguozhe 2012-02-29 11:13:30
运行结果:
[root@heiying udp]# ./udp_client
recv: Bad address
[root@heiying udp]#




[root@heiying udp]# ./udp_server
receive from client is A



服务端 udp_server
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
int i,byte;
char char_recv,char_send;

server_sockfd = socket(AF_INET, SOCK_DGRAM, 0);

server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
server_address.sin_port = 9734;
server_len = sizeof(server_address);

bind(server_sockfd, (struct sockaddr *)&server_address, server_len);

client_len=sizeof(client_address);
for(i=0,char_send='1';i<5;i++,char_send++)
{
if((byte=recvfrom(server_sockfd,&char_recv,1,0,(struct sockaddr *)&client_address,(socklen_t *)&client_len))==-1)
{
perror("recv");
exit(EXIT_FAILURE);
}
printf("receive from client is %c\n",char_recv);

if((byte=sendto(server_sockfd,&char_send,1,0,(struct sockaddr *)&client_address,(socklen_t)client_len))==-1)
{
perror("send");
exit(EXIT_FAILURE);
}
}
//shutdown(client_sockfd,2);
shutdown(server_sockfd,2);
}




客户端 udp_client

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
int sockfd;
int len,cl_len;
struct sockaddr_in address,cl_addr;
int result;
int i,byte;
char char_recv,char_send;
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0))==-1)
{
perror("socket");
exit(EXIT_FAILURE);
}

address.sin_family = AF_INET; //设置服务器主机信息
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = 9734;
// cl_addr.sin_family = AF_INET;
// cl_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
// cl_addr.sin_port = 9739;


len = sizeof(address);
// cl_len= sizeof (cl_addr);
// bind(sockfd, (struct sockaddr *)&cl_addr, len);

for(i=0,char_send='A';i<5;i++,char_send++)
{
if((byte=sendto(sockfd,&char_send,1,0,(struct sockaddr *)&address,(socklen_t)len)) == -1 )
{
perror("sendto");
exit(EXIT_FAILURE);
}
if((byte=recvfrom(sockfd,&char_recv,1,0,(struct sockaddr *)&address,(socklen_t *)len))==-1)
{
perror("recv"); //这句会打印出来
exit(EXIT_FAILURE);
}
printf("receive from client is %c\n",char_recv);

/* if((byte=recv(sockfd,&char_recv,1,0))==-1)
{
perror("recv");
exit(EXIT_FAILURE);
}
printf("receive from server %c\n",char_recv);
*/}
close(sockfd);
exit(0);
}
...全文
590 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
啊kun 2012-03-07
  • 打赏
  • 举报
回复
int PASCAL FAR recvfrom( SOCKET s, char FAR* buf, int len, int flags,
  struct sockaddr FAR* from, int FAR* fromlen);
  s:标识一个已连接套接口的描述字。
  buf:接收数据缓冲区。
  len:缓冲区长度。
  flags:调用操作方式。
  from:(可选)指针,指向装有源地址的缓冲区。
  fromlen:(可选)指针,指向from缓冲区长度值。
justkk 2012-03-03
  • 打赏
  • 举报
回复
应该是 第五个参数为NULL时,第6个参数被忽略
weiguozhe 2012-03-03
  • 打赏
  • 举报
回复
那为什么我把 recvfrom函数的第五个参数改为 NULL ((socklen_t *)len 这个不改)也不会出错了 ??????

gohome520 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 weiguozhe 的回复:]

谢谢啦,那请问为什么第五个参数要为NULL ????? 什么意思啊 ????
[/Quote]
不好意思,上面我讲错了。回头细想了一下,感觉不太对。
错误的地方应该是下面这一句:
byte=recvfrom(sockfd,&char_recv,1,0,(struct sockaddr *)&address,(socklen_t *)len)

recvfrom()最后一个参数是个指针,因此,不应该是(socklen_t *)len,而是(socklen_t *)&len。
weiguozhe 2012-03-02
  • 打赏
  • 举报
回复
谢谢啦,那请问为什么第五个参数要为NULL ????? 什么意思啊 ????
gohome520 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gohome520 的回复:]

第5个参数应该为NULL吧。
[/Quote]
recvfrom的第5个参数应该为NULL,这个参数应该是只在服务器上有用。
gohome520 2012-03-01
  • 打赏
  • 举报
回复
第5个参数应该为NULL吧。
justkk 2012-03-01
  • 打赏
  • 举报
回复
试试 htons(9734)

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧