[英]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
这样的东西。 只有原始二进制数据-字节序列。
此代码的问题如下:
length = strlen(txt);
-用于计算以零结尾的宽字符串的长度的函数为wcslen
。 对于小端UTF16字符串(在WIN32平台上为宽字符串),如果第一个宽字符是ASCII(或Latin1)字符,则strlen
返回1(因为第二个字节是第一个宽字符的高字节,并且对于ASCII包含零字符)。
nWrite = send( desc, txt + iStart, nBlock, 0 )
您send
BYTES不是字符 (尤其不是宽字符 )。 因此,如果您要发送宽字符串的二进制表示形式(该格式不是可移植的,因此不应通过网络发送,但如果客户端和服务器在同一平台上就可以工作),则必须这样做: nWrite = send( desc, txt + iStart, sizeof(wchar_t)*nBlock, 0 )
。 当您像发送时一样,只发送一半的宽字符串。 当然,连接另一端的应用程序应注意,已发送特定平台的宽字符串的二进制表示形式(而不是ASCII字符串或其他形式)。
当然,您绝不应该执行类似发送平台/编译器特定的内部二进制宽字符串表示形式的操作。 您应该使用一些有据可查的网络协议(例如telnet或HTTP或其他协议),其中大多数使用ASCII或UTF-8字符编码来表示文本。 因此,您应该将宽字符串转换为所选协议所需的表示形式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.