我有个MFC写的CSocket程序,下面是我摘抄的代码://CListenSocket 是继承自CSocket
CListenSocket m_socket;
m_socket.Create();
m_socket.Connect(m_sServerIp,m_nServerPort);
typedef struct{
 int cmd; //cmdID
 int sequence; //序列
 int totallen; //总长度
}RESINFO;
RESINFO resinfo;
memset(&resinfo,0,sizeof(resinfo));
resinfo.totallen=12;
resinfo.sequence=1;
resinfo.cmd=2;

m_socket.Send(&resinfo,52);
............................
以上代码能执行成功,且对方马上能收到数据,如果加上htonl()函数,对方只能感知到连接上,但数据就是收不到
/*****************************
resinfo.totallen=htonl(56);
resinfo.sequence=htonl(1);
resinfo.cmd=htonl(2);

******************************/这是为什么啊,跪求大虾们帮帮弟兄!!!!在线等待....

解决方案 »

  1.   

    对不起有行代码更正一下:m_socket.Send(&resinfo,52);改为 m_socket.Send(&resinfo,12);
      

  2.   

    接收方需要 ntohl(),必须一致。
      

  3.   

    对方肯定是收到数据了,RESINFO是在TCP协议之上自定义的协议头吧?两端协议要一致,既然不加htonl可以收到,那你就不要加了。
      

  4.   

    不是这个问题吧,要看你的Send里面是怎么实现的啊,按道理,它们只是传输的负载而已啊,能不能把代码给多点,好定位下
      

  5.   

    你真多此一举,CSocket已经帮你做好转换了,
    除非你用API函数才要亲自转换。
      

  6.   

    ............................ 
    以上代码能执行成功,且对方马上能收到数据,如果加上htonl()函数,对方只能感知到连接上,但数据就是收不到 
    /***************************** 
    resinfo.totallen=htonl(56); 
    resinfo.sequence=htonl(1); 
    resinfo.cmd=htonl(2); 
    这个是你的数据,转换为htonl做什么呢? ? ? lz别画蛇添足
      

  7.   

    很显然时你用了htonl把数搞错了么
    不知道htonl干吗就用?它可是把字节序交换,一个数字1,你调用一下就知道它变成啥了。不要以为一个有用得函数就到处用,每个函数都有其应该用得地方,不应该用得地方。既然不用htonl可以,说明双方字节序一致,你一换不匹配了,当然就不行了
      

  8.   

    API函数方式,在指定端口时,需要使用htonl(),这是为了将主机字节顺序转化网络字节顺序。但这个CListenSocket的send方法很可能自己使用了htonl(),或者根本不需要htonl(),这两种情况下,用户代码就不需要使用htonl(),用了反而会出错。
      

  9.   

    确实,我都只用API,CSOKET从来不用,可能就是出在CSOKET自己处理了字节转换的问题.
      

  10.   

    稍微改一下你的包的结构typedef struct{ 
     char begin[10];
     int cmd; //cmdID 
     int sequence; //序列 
     int totallen; //总长度 
    }RESINFO; 就可以立刻发送出去,不知你发现没有,如果你用java写的话,对方同样收不到,我做过测试,好像以\0开始的结构,java不能收!