免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4165 | 回复: 10
打印 上一主题 下一主题

关于网络数据传输的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-27 11:14 |只看该作者 |倒序浏览
UDP通讯方式,客户端向服务器端发送数据.

现在,我在客户端填充数据,并且将点分十进制ip用inet_pton()转换成网络字节序二进制值,在用memset()将此值存入缓存,发送缓存数据,对服务器端接受到的数据解析,得到的二进制值不一样,当然转换成点分十进制ip也是与原来的不同,问题出在哪呢??
是不是接受到数据之后还要进行ntohl()转化??可是我有一个数据是u_short型的,没有转换也成功接受了.

请高手帮忙!!谢谢

论坛徽章:
0
2 [报告]
发表于 2006-12-27 11:16 |只看该作者
试试

论坛徽章:
0
3 [报告]
发表于 2006-12-27 11:23 |只看该作者
原帖由 kf701 于 2006-12-27 11:16 发表
试试


期待结果.

我是有点晕了,想想,我是把ip地址转换成了二进制值,存入了缓存,并且进行打印输出结果. 服务器断接受到数据后,在对应缓存地址读取数据,打印出来的值为什么会不一样呢??

论坛徽章:
0
4 [报告]
发表于 2006-12-27 11:56 |只看该作者
字节序的问题引起的

论坛徽章:
0
5 [报告]
发表于 2006-12-27 14:30 |只看该作者
//客户端程序
typedef struct
{
        u_char begin;
        u_short len;
        u_short count;
        u_char type;
        u_char spread1;
        long spread2;
}HEAD;
int udp_send(int fd, char *msg, int len, struct sockaddr *to, int tolen)
{
        int n;
        n = sendto(fd, msg, len, 0, to, tolen);
        if(n < 0)
        {
                perror("send error");
                exit(2);
        }
        return n;
}
//封装数据函数
void AnalyserRegedit(char *buf, struct in_addr ip)
{
        char *p;
        HEAD head;
        u_short len;
        u_char key, end;
        u_char *e;
        struct in_addr *l_ip;
        head.begin = 0x10;
        head.type = 0x04;
        head.count = 0x01;
        head.len = 0x0F;
        key = 0x04;
        end = 0x11;
        printf("longip:%u",ip);
        printf("head.begin:%x",head.begin);
        memcpy(buf, (void *)&head, sizeof(HEAD));
        memcpy(buf+sizeof(HEAD),(void *)&key,sizeof(u_char));
        memcpy(buf+sizeof(HEAD)+sizeof(u_char),(void *)&ip,sizeof(struct in_addr));
        memcpy(buf+sizeof(HEAD)+sizeof(u_char)+sizeof(struct in_addr),(void *)&end,sizeof(u_char));
        l_ip = (struct in_addr *)(buf + sizeof(HEAD) + sizeof(u_char));
        printf("longip:%u, charip:%s\n",*l_ip, inet_ntoa(*l_ip));
        e = (u_char *)(buf + sizeof(HEAD) + sizeof(u_char) + sizeof(struct in_addr));
        printf("end:%x\n",*e);
}
//客户端main,运行命令:./client 服务器ip 端口 本机ip
int main(argc, *argv[])
{
        inet_pton(AF_INET, argv[3], &longip);
        AnalyserRegedit(buf1, longip);
                while (fgets(send, 100, stdin) != NULL)
        {
                AnalyserRegedit(buf1, longip);
                n = udp_send(sockfd, buf1, 15, (struct sockaddr *)&serveraddr, sin_size);
                if(n < 0)
                {
                        perror("send error");
                        continue;
                }
                  }
}




//服务器端程序
void de_buf(char *buf)
{
        HEAD *head;
        u_char *key, *end;
        struct in_addr *longip;
        head = (HEAD *)buf;
        key = (u_char *)(buf + sizeof(HEAD));
        longip = (struct in_addr *)(buf + sizeof(HEAD) + sizeof(u_char));
        end = (u_char *)(buf + sizeof(HEAD) + sizeof(u_char) + sizeof(struct in_addr));
//        if(*end == 0x11)
        {
                printf("begin:%x len:%d count:%x type:%x\n",head -> begin,head ->len,head ->count,head ->type);
                printf("key:%d\n",*key);
                printf("longip:%u, charip:%s\n",*longip, inet_ntoa(*longip));
                printf("end:%x\n",*end);
        }
//        else
        {
                printf("Error!\n");
        }
}

int main(int argc, char **argv)
{
        while(1)
        {
                memset(buf2,0,15);
                printf("begin receive\n");
                n = udp_recv(sockfd, buf2, 15, (struct sockaddr *)&clientaddr, sin_size);
//                buf2[n] = '\0';
                printf("after receive\n");
                if(n < 0)
                {
                        perror("Can not receive message");
                        continue;
                }
                else
                {
                        printf("sizeof(n):%d",n);
                        printf("The data from ip:%s,   port:%d !\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));
                        h = (HEAD *)buf2;
                        l_ip = (struct in_addr *)(buf2 + sizeof(HEAD) + sizeof(u_char));
                        llip = l_ip -> s_addr;
                        printf("begin:%x len:%d count:%x type:%x\n",h -> begin,h ->len,h ->count,h ->type);
                        printf("longip(l_ip):%u, charip:%s\n\n\n\n\n\n",ntohl(llip), inet_ntoa(*l_ip));
                        de_buf(buf2);
                }
}


现在接受到的数据,显示HEAD结构体里的值是对的,但是ip地址显示出错,比如传输的是192.168.0.1,显示的是192.168.0.92,传输202.168.0.1,显示202.168.0.92,就是最后两项总是不变.而且最后一项end的值我传的是0x11但是显示总是a,也是出错的,高手帮我看看,问题出在哪里,可以吗???

论坛徽章:
0
6 [报告]
发表于 2006-12-27 21:05 |只看该作者
真的是好难找问题
我的思想是把ip地址转化为in_addr结构,应该是4个字节的,把他压入缓存,用sendto传输.
服务器端接受到数据buf.进行解析(struct in_addr *)buf,有问题吗???
只是程序中取的时候buf+了相应的字节数,就是从存放ip网络字节的地方读取,为什么读出的结果会和发送之前的不一样呀???

请问网络上传输数据该怎么处理??

论坛徽章:
0
7 [报告]
发表于 2006-12-27 21:10 |只看该作者
ntohl

network to host long

论坛徽章:
0
8 [报告]
发表于 2006-12-27 22:29 |只看该作者
inet_*操作,自动做了字节序转换的

论坛徽章:
0
9 [报告]
发表于 2006-12-28 08:52 |只看该作者
把数据抓出来跟发送前对比一下就清楚了

论坛徽章:
0
10 [报告]
发表于 2006-12-28 12:25 |只看该作者
sizeof(HEAD)??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP