none
SOCKET如何正确处理发送UNICODE RRS feed

  • 问题

  • 发送字符串没问题,关键是当有一个结构体加上UNICODE字符串的时候就出问题了。。。

    sizeof(struct) + sizeof(TCHAR) * nMsgLen

    发送长度设置,结构体大小 加上 TCHAR的大小乘以字符串长度。。。

    但是我抓包发现 我传送的数据根本没发过去。。。

    然后我 在上面的大小基础上 在乘以 2,发送的内容 就过去了。但是我接收端完全没法解析长度。

    怎么解决这个问题呢?


    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖

    2013年3月24日 9:03

答案

  • 为什么要这么发送数据?您可以分成2次send出去?
    您的结构体是怎么定义的?是不是结构体中定义了柔性数组,所以才采用这种方式发送数据呢?

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    • 已标记为答案 dowflyon 2015年1月7日 7:59
    2013年3月25日 7:40
    版主

全部回复

  • 为什么要这么发送数据?您可以分成2次send出去?
    您的结构体是怎么定义的?是不是结构体中定义了柔性数组,所以才采用这种方式发送数据呢?

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    • 已标记为答案 dowflyon 2015年1月7日 7:59
    2013年3月25日 7:40
    版主
  • 1. TCP是不能发送指定大小的(一般大于512个字节会分段),它是流,你得发 长度+数据 来告诉接收方怎么接受数据

    2. TCHAR的定义不一定是wchar_t,只有在Unicode模式下他才是。你要是不能确定你项目的Encode模式,那就用sizeof(struct) + sizeof(wchar_t) * nMsgLen


    0xDEADBEEF

    2013年3月25日 8:39
    版主
  • 不管什么类型都按2进制处理转成字节流肯定没问题

    新浪微博http://weibo.com/xianglitian,欢迎围观

    2013年3月25日 10:43
  • 分两次发送没意义 太麻烦了!

    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖

    2013年3月28日 11:52
  • 我就是这样发送的 TCHAR 肯定是UNICODE 我都说了是UNICODE

    关键是根本没发出去 后面的数据抓包 也没有分片


    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖

    2013年3月28日 11:54
  • TCP是二进制流的形式,所以如果没发出去和是不是UNICODE没什么关系。我觉得你可以尝试只发结构体然后看看结果。是否是连接有问题?你的结构体是否有内存对齐问题。

    麻烦把正确答案设为解答。

    2013年3月29日 3:42
    版主
  • 单独发结构体没问题 我上面就说了

    typedef struct tag_AuthReg_Protocol 
    {
    UINT nProtocolStart;                                                 
    ENUM_AUTHORIZEREG_PROTOCOL enAuthorize_Protocol;                   

    SYSTEMTIME st_TimeLeft;                                    
    SYSTEMTIME st_TimeReg;                                 
    SYSTEMTIME st_TimeActive;                                   

    TCHAR tszUserName[32];        
    TCHAR tszPassword[32];        
    int nMsgLen;                                                        
    WORD wReturnCode;                                                     
    UINT nProtocolEnd;                                                   
    }AUTHREG_PROTOCOL,*LPAUTHREG_PROTOCOL;


    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖

    2013年3月30日 4:55
  • 你怎么把这个结构体和字符串拼在一起的?既然你想一起发,size也是两个加一起的大小,那么怎么拼的内存?

    麻烦把正确答案设为解答。

    2013年4月1日 3:03
    版主
  • 这个当然知道啊。。

    wchar *p = new wchar[sizeof(struct) + sizeof(TCHAR) * nMsgLen]

    memcpy(p,struct,sizeof(struct));

    memcpy(p+sizeof(struct),内容,sizeof(wchar) * 内容长度)

    send(,p,sizeof(struct) + sizeof(TCHAR) * nMsgLen)


    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖

    2013年4月4日 3:13
  • 如果用ANSI编码是没问题的,用UNICODE编码就没法完全发送!

    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖

    2013年4月4日 3:13