免费注册 查看新帖 |

Chinaunix

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

64位上程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-23 10:22 |只看该作者 |倒序浏览
各位老大们帮忙看下,下面这段代码我在32位上编译后,执行正常的,但是移到64位下编译后,运行时就出现浮点数错误,请教下各位,谢谢。


代码如下:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>


int main()
{
        char * srvr_addr = "127.0.0.23";
        int srvr_port = 9099;
        struct sockaddr_in adr_srvr;
        struct sockaddr_in adr_clnt;
        char * buf = "this is server";

        int s = socket(PF_INET, SOCK_STREAM, 0);
        if(-1 == s)
                perror("socket error\n");

        memset(&adr_srvr, 0, sizeof(adr_srvr));
        adr_srvr.sin_family = AF_INET;
        adr_srvr.sin_port = htons(srvr_port);
        adr_srvr.sin_addr.s_addr = inet_addr(srvr_addr);

        int z = bind(s, (struct sockaddr *)&adr_srvr, sizeof(adr_srvr));
        if(-1 == z)
                perror("bind error\n");

        int l = listen(s, 10);
        if(-1 == l)
                perror("listen error\n");

        while(1)
        {
                int len = sizeof(adr_clnt);
                int c = accept(s, (struct sockaddr *)&adr_clnt, &len);
                if(-1 == c)
                        perror("accept error\n");

                int w = write(c, buf, 20);
                printf("send to client ::: %s, %d cha\n", buf, w);
                printf("lient addr ::: %s\n", inet_ntoa(adr_srvr.sin_addr));

                close(c);
        }
        return 0;
}


各位帮忙看看,谢谢了。为什么会出错呢,要怎么改才能可以正确运行呢,谢谢了大家!!!!!

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2009-12-23 10:26 |只看该作者
write(c, buf, 20);,buf那个字符串没有20字节长,改成 strlen(buf)+1

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2009-12-23 10:31 |只看该作者
另外accept(s, (struct sockaddr *)&adr_clnt, &len);看看accept的定义,最后一个一般定义成socklen_t,看看字节数是否与int相等

论坛徽章:
0
4 [报告]
发表于 2009-12-23 10:33 |只看该作者
那客户端那边read的时候,要读多少个字节啊,怎么写呢。

比如:read(s, &rebuf, ****);   其中****要怎么写呢?

谢谢了楼上的兄弟!!!

论坛徽章:
0
5 [报告]
发表于 2009-12-23 10:35 |只看该作者
楼上的大侠,顺便再问下啊,像htonl, ntohl这样的函数,在64位系统上,能够正常使用吗,好像听说有什么宏。

毕竟这两韩式是32位的,在64位上要怎么做呢


谢谢啦!!!

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
6 [报告]
发表于 2009-12-23 10:45 |只看该作者
原帖由 fanzhijie875151 于 2009-12-23 10:33 发表
那客户端那边read的时候,要读多少个字节啊,怎么写呢。

比如:read(s, &rebuf, ****);   其中****要怎么写呢?

谢谢了楼上的兄弟!!!


一般写rebuf的空间大小。
这个问题你应该看帮助

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
7 [报告]
发表于 2009-12-23 10:49 |只看该作者
原帖由 fanzhijie875151 于 2009-12-23 10:35 发表
楼上的大侠,顺便再问下啊,像htonl, ntohl这样的函数,在64位系统上,能够正常使用吗,好像听说有什么宏。

毕竟这两韩式是32位的,在64位上要怎么做呢


谢谢啦!!!


虽然long在64位一般是8字节,不过这两函数的参数不一定是定义成long的,我没有用来转换过64位的整数。
如果不行就自己写转换下字节序,或者转换成字符串。

论坛徽章:
0
8 [报告]
发表于 2009-12-23 10:56 |只看该作者
谢谢大侠。

下面是我的客户端程序,在32位上是没问题的,可总是很奇怪,在64位下又出现了浮点数错误的信息,大哥帮忙看下,谢谢!!!


代码如下:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/un.h>

int main()
{
        char * srvr_addr = "127.0.0.23";
        int srvr_port = 9099;
        struct sockaddr_in adr_srvr;
        struct sockaddr_in adr_clnt;
        char rebuf[50];

        int s = socket(PF_INET, SOCK_STREAM, 0);
        if(-1 == s)
                perror("socket error\n");

        memset(&adr_srvr, 0, sizeof(adr_srvr));
        adr_srvr.sin_family = AF_INET;
        adr_srvr.sin_port = htons(srvr_port);
        adr_srvr.sin_addr.s_addr = inet_addr(srvr_addr);

        int n = connect(s, (struct sockaddr *)&adr_srvr, sizeof(adr_srvr));
        if(-1 == n)
                perror("connect error\n");

        int r = read(s, &rebuf, 50);
        rebuf[r]=0;

        printf("server said : %s\n", rebuf);

        close(s);

        return 0;

}

论坛徽章:
0
9 [报告]
发表于 2009-12-23 13:50 |只看该作者
浮点数的精度有变化,自己注意一下吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP