gpt4 book ai didi

c++ - 如何使用 winsock 的 send() 函数发送宽字符?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:01:53 35 4
gpt4 key购买 nike

它说 here发送函数需要 const char*。

如何发送宽字符?我尝试了以下方法:

void MyClass::socksend(const wchar_t* wbuffer) {
int i;
char *buffer = (char *)malloc( MB_CUR_MAX );
wctomb_s(&i,buffer, MB_CUR_MAX, (wchar_t)wbuffer);
int buflen = strlen(buffer) + 2;
char sendbuf[DEFAULT_BUFLEN];
strcpy_s(sendbuf,buflen,buffer);
sendbuf[buflen - 1] = '\n';
int senderror = send(this->m_socket, sendbuf, buflen, 0);
// error handling, etc goes here...

}

这不符合我的预期。它似乎没有向套接字发送任何东西。我该如何解决这个问题?

最佳答案

首先什么是宽字符?大于8位的整数值;这意味着您将必须处理字节顺序。您需要将宽字符数组编码为 char 数组,然后将其作为 char 数组发送。在接收端,需要将char数组解码为宽字符数组。

函数 wctomb_s 仅将一个单个宽字符编码为字符数组。您要将宽字符数组 编码为字符数组 的函数是wcstombs_s。相应地,解码使用mbstowcs_s。

省略了错误处理(未经测试):

void MyClass::socksend(const wchar_t* wbuffer) { 
// determine the required buffer size
size_t buffer_size;
wcstombs_s(&buffer_size, NULL, 0, wbuffer, _TRUNCATE);

// do the actual conversion
char *buffer = (char*) malloc(buffer_size);
wcstombs_s(&buffer_size, buffer, buffer_size, wbuffer, _TRUNCATE);

// send the data
size_t buffer_sent = 0;
while (buffer_sent < buffer_size) {
int sent_size = send(this->m_socket, buffer+buffer_sent, buffer_size-buffer_sent, 0);
buffer_sent += sent_size;
}

// cleanup
free(buffer);
}

关于c++ - 如何使用 winsock 的 send() 函数发送宽字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4350259/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com