繁体   English   中英

在C ++中通过Winsock发送Unicode字符串

[英]sending Unicode string via winsock in c++

我更改了以下代码,将Unicode字符串发送到客户端。

请检查一下,并告诉我为什么当txt包含Unicode字符时,在客户端为什么我无法接收任何数据?

bool write_to_descriptor( int desc, wchar_t *txt, int length )
//bool write_to_descriptor( int desc, char *txt, int length )
{
    int iStart;
    int nWrite;
    int nBlock;

    if ( length <= 0 )
    length = strlen(txt);

    for ( iStart = 0; iStart < length; iStart += nWrite )
    {
    nBlock = UMIN( length - iStart, 4096 );
    if ( ( nWrite = send( desc, txt + iStart, nBlock, 0 ) ) < 0 )
        { perror( "Write_to_descriptor" ); return FALSE; }
    }

    return TRUE;
}

对于TCP(和UDP)协议,没有wchar_t这样的东西。 对于函数send ,没有wchar_t这样的东西。 只有原始二进制数据-字节序列。

此代码的问题如下:

  1. length = strlen(txt); -用于计算以零结尾的宽字符串的长度的函数为wcslen 对于小端UTF16字符串(在WIN32平台上为宽字符串),如果第一个宽字符是ASCII(或Latin1)字符,则strlen返回1(因为第二个字节是第一个宽字符的高字节,并且对于ASCII包含零字符)。

  2. nWrite = send( desc, txt + iStart, nBlock, 0 )send BYTES不是字符 (尤其不是宽字符 )。 因此,如果您要发送宽字符串的二进制表示形式(该格式不是可移植的,因此不应通过网络发送,但如果客户端和服务器在同一平台上就可以工作),则必须这样做: nWrite = send( desc, txt + iStart, sizeof(wchar_t)*nBlock, 0 ) 当您像发送时一样,只发送一半的宽字符串。 当然,连接另一端的应用程序应注意,已发送特定平台的宽字符串的二进制表示形式(而不是ASCII字符串或其他形式)。

  3. 当然,您绝不应该执行类似发送平台/编译器特定的内部二进制宽字符串表示形式的操作。 您应该使用一些有据可查的网络协议(例如telnet或HTTP或其他协议),其中大多数使用ASCII或UTF-8字符编码来表示文本。 因此,您应该将宽字符串转换为所选协议所需的表示形式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM