【求助】sendto()为什么发送不出去,有代码。

晖晖要运动 2011-09-14 04:19:20
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <errno.h>
main()
{
char str[INET_ADDRSTRLEN];
struct sockaddr_in devaddr;
socklen_t devaddr_len;
char Sendbuf[20];
int udpfd;
struct sockaddr_in servaddr;
char buf[3000];

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(8503);
if((udpfd = socket(AF_INET, SOCK_DGRAM, 0))==-1)
{
printf("create socket error: %s(errno: %d) \n",strerror(errno),errno);
exit(1);
}
if(bind(udpfd, (struct sockaddr *)&servaddr, sizeof(servaddr))==-1)
{
printf("listen socket error: %s(errno: %d) \n",strerror(errno),errno);
exit(1);
}
printf("Accepting UDP connections ...\n");
while(1)
{
devaddr_len = sizeof(devaddr);
int n = recvfrom(udpfd, buf, 3000, 0, (struct sockaddr *)&devaddr, &devaddr_len);
if (n == -1)
{
printf("recive data from device error: %s(errno: %d) \n",strerror(errno),errno);
exit(1);
}
printf("received from %s at PORT %d\n",
inet_ntop(AF_INET, &devaddr.sin_addr, str, sizeof(str)),
ntohs(devaddr.sin_port));
printf(" lenth of received data from device is: %d \n",n);
memset(Sendbuf, 0, 20);
Sendbuf[0] = 19;
Sendbuf[1] = 85;
Sendbuf[2] = 6;
Sendbuf[3] = 0 ;
Sendbuf[4] =1 ;

int send5 = sendto(udpfd,Sendbuf,20,0,(struct sockaddr *)&devaddr,sizeof(devaddr));
if (send5 == -1)
{
printf("发送回复包失败: %s(errno: %d) \n",strerror(errno),errno);
exit(1);
}
else
printf("回复包长度: %d\n",send5);
}
}


运行结果:
Accepting UDP connections ...
received from 112.97.24.65 at PORT 17000
lenth of received data from device is: 68
回复包长度: 20
received from 112.97.24.65 at PORT 17000
lenth of received data from device is: 68
回复包长度: 20
received from 112.97.24.65 at PORT 17000
lenth of received data from device is: 68
回复包长度: 20

可以收到对方发的数据,但是为什么数据发不出去呢???
...全文
847 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
晖晖要运动 2011-09-15
  • 打赏
  • 举报
回复
这个程序没有问题。我的问题已经解决了,哈哈。。
hanyuwei0 2011-09-15
  • 打赏
  • 举报
回复
自己写个简单的接收端程序测试下就知道了。不要你所谓的vb.net程序
Memory秀 2011-09-15
  • 打赏
  • 举报
回复
单步执行下,看看到哪跳出了!
晖晖要运动 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 anwjiango 的回复:]

char Sendbuf[21]; 再试试
[/Quote]
试过了。。。不行。。。
AnwJiango 2011-09-14
  • 打赏
  • 举报
回复
char Sendbuf[21]; 再试试
晖晖要运动 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 paolochristian 的回复:]

看看sendto的返回值是多少?如果等于发送到字节数,说明已经发送出去了啊!确定接收方没问题?
[/Quote]

sendto 的返回值是20。是不是表示一定发出去了呢?

对端肯定没有问题,对端是用VB.NET编写的,而且运行在Windows Mobile手机上。我用其他人写的VB.NET程序,就能正常与手机通信,所以我确定,手机那边没有没有问题。


对端大概是这样:1.判断接收数组的长度必须大于等于20.
2.判断第1-3个字节分别是19,85,6
3,显示“收到回复!”,并显示第4-5个字节
AnwJiango 2011-09-14
  • 打赏
  • 举报
回复
int send5 = sendto(udpfd,Sendbuf,20,0,(struct sockaddr *)&devaddr,sizeof(devaddr));
if (send5 == -1)
{
printf("发送回复包失败: %s(errno: %d) \n",strerror(errno),errno);
exit(1);
}
else
// 这里是你sendto发送的长度, 说明已经发送出去了。
printf("已经发送...不是接受回复....: %d\n",send5);
AnwJiango 2011-09-14
  • 打赏
  • 举报
回复
看错

AnwJiango 2011-09-14
  • 打赏
  • 举报
回复
int send5 = sendto(udpfd,Sendbuf,20,0,(struct sockaddr *)&devaddr,sizeof(devaddr)); 参数错误。
paolochristian 2011-09-14
  • 打赏
  • 举报
回复
看看sendto的返回值是多少?如果等于发送到字节数,说明已经发送出去了啊!确定接收方没问题?
qq120848369 2011-09-14
  • 打赏
  • 举报
回复
没报错,说明发出去了。

看看另一端的代码。
jackyjkchen 2011-09-14
  • 打赏
  • 举报
回复
好像没问题,广域网的话是不是udp没法出去?

你尽量简化程序看看,最好只留recv和send

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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