2017-06-22 3 views
0

私はposix(BSD)ソケットを使ってWindowsに(winsockを使って)移植しています。これは問題ありませんが、私はsendで問題に遭遇しました(私はrecvに同じ問題があるかもしれないと思います)。 Windows上のクロスプラットフォームソケット送信、バッファconst void *、Linuxのconst char *、Windowsでの処理に最適な方法は?

ssize_t send(int sockfd, const void *buf, size_t len, int flags); 

ことがある(hereを参照してください):Linuxでは、この関数は、シグネチャ(hereを参照)がある

int send(
    _In_  SOCKET s, 
    _In_ const char *buf, 
    _In_  int len, 
    _In_  int flags 
); 

を、私は問題を抱えている最初の場所では、このようなデストラクタである:

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); 

は、void*のようにウィンドウでコンパイルエラーが発生すると、const char*にキャストできません。

ここでは、すべての呼び出しをラップしてWindows用の#ifdefに送信することができますが、これを処理するにはこれが最善の方法ですか?よりエレガントな方法がありますか?対処するにはsendrecvへの呼び出しがかなりあります。 const char *

+0

キャストをコンパイルする必要がありますか? – Holt

+1

ところで、Windowsでは 'SOCKET'型は符号なしなので、' if(pUS-> GetSock()> = 0) 'を実行することはできません。代わりに 'INVALID_SOCKET'と比較してください。 –

+0

@Tulon、チップをありがとう! – crobar

答えて

0

キャスト、それを、それは両方のプラットフォームで `のconstのchar *`へ

+0

それは簡単だろうとは思わなかった。 – crobar

関連する問題