C++ 跨平台套接字发送,linux上的缓冲区const void*,windows上的const char*,最好的处理方法?
我正在将一个使用posix(BSD)套接字的程序移植到windows(使用winsock)。这一切正常,但我遇到了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
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);