Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 跨平台套接字发送,linux上的缓冲区const void*,windows上的const char*,最好的处理方法?_C++_Sockets_Cross Platform - Fatal编程技术网

C++ 跨平台套接字发送,linux上的缓冲区const void*,windows上的const char*,最好的处理方法?

C++ 跨平台套接字发送,linux上的缓冲区const void*,windows上的const char*,最好的处理方法?,c++,sockets,cross-platform,C++,Sockets,Cross Platform,我正在将一个使用posix(BSD)套接字的程序移植到windows(使用winsock)。这一切正常,但我遇到了send的问题(我认为recv可能也有同样的问题)。在Linux上,此函数具有签名(请参阅): 在windows上,它是(请参阅): 我遇到的第一个问题是在这样的析构函数中: ExtSocketHandler::~ExtSocketHandler(void) { if (pUS->GetSock() >= 0) { uint8_t u = ES_A

我正在将一个使用posix(BSD)套接字的程序移植到windows(使用winsock)。这一切正常,但我遇到了
send
的问题(我认为
recv
可能也有同样的问题)。在Linux上,此函数具有签名(请参阅):

在windows上,它是(请参阅):

我遇到的第一个问题是在这样的析构函数中:

ExtSocketHandler::~ExtSocketHandler(void)
{
    if (pUS->GetSock() >= 0) {
        uint8_t u = ES_ABORT;

        // ignore result
        (void)send(pUS->GetSock(), (void *)&u, sizeof(u), send_flags);
    }
    SAFEDELETE(pUS);
}
线路在哪里

(void)send(pUS->GetSock(), (void *)&u, sizeof(u), send_flags);
在windows上导致编译器错误,因为无法将
void*
强制转换为
const char*


现在,我想我可以将所有调用包装成windows版的
#ifdef
,但这是处理此问题的最佳方法吗?还有更优雅的方式吗?有相当多的调用要处理
send
recv

将其转换为
const char*
,它应该在两种平台上编译转换为
const char*
?顺便说一句,由于类型
SOCKET
在Windows上未签名,如果(pUS->GetSock()>=0),则不能执行
。将其与无效的\u插座进行比较。@Tulon,谢谢你的提示@crobar如果要检查无效/单元化套接字,请使用
无效\u套接字
常量,如果尚未定义(非windows系统),则将其定义为
-1
。无需将任何内容强制转换为
无效*
。如果你认为有,那就是你做错了。
ExtSocketHandler::~ExtSocketHandler(void)
{
    if (pUS->GetSock() >= 0) {
        uint8_t u = ES_ABORT;

        // ignore result
        (void)send(pUS->GetSock(), (void *)&u, sizeof(u), send_flags);
    }
    SAFEDELETE(pUS);
}
(void)send(pUS->GetSock(), (void *)&u, sizeof(u), send_flags);