5

mingw で UDP ソケットを作成しようとしましたが、errno =で がsocket()返されます。変。winsock2.h を含めました。最初はコンパイルエラーがありましたが、Code::Block の Linker Settings を設定した後 、コンパイルは成功しました。-10undefined reference to socket@12-lws2_32-lwsock32

sockfd = socket(AF_INET, SOCK_DGRAM, 0);
RDF_LOG(kDEBUG, "sockfd %d ", sockfd);
if (sockfd < 0){
    RDF_LOG(kERROR, "ERROR: %s , errno %d\n", strerror(errno), errno);
}

結果 --> sockfd -1 エラー: エラーなし、errno 0


OK、代わりに RDF_LOG を fprintf に変更します。

int tmp = 0;

sockfd = socket(AF_INET, SOCK_DGRAM, 0);
tmp = errno;
fprintf(stderr, "sockfd %d ", sockfd);
if (sockfd < 0){
    fprintf(stderr, "socket: %s , errno %d\n", strerror(tmp), tmp);
}

返される結果は、まだ --> sockfd -1 socket: No error , errno 0 mingw が errno をサポートしていない可能性はありますか??

4

4 に答える 4

8

私が最初することはこれです:

sockfd = socket(AF_INET, SOCK_DGRAM, 0);
int tmp = errno;
RDF_LOG(kDEBUG, "sockfd %d ", sockfd);
if (sockfd < 0){
    RDF_LOG(kERROR, "ERROR: %s , errno %d\n", strerror(tmp), tmp);
}

変数に何RDF_LOGが行われているのerrnoかわかりません。これにより、変数が変更されるかどうかがわかります。

もう 1 つ確認すべきことは、WSAStartup. 次の最小限のプログラムは、うまくいけばこれを行う方法を示し、デバッグの開始点を提供するはずです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <winsock2.h>

int main (void) {
    WSADATA wsaData;
    int listenFd;

    if (WSAStartup(MAKEWORD(1,1), &wsaData) == SOCKET_ERROR) {
        printf ("Error initialising WSA.\n");
        return -1;
    }

    listenFd = socket (AF_INET, SOCK_STREAM, 0);
    if (listenFd  < 0) {
        printf ("Error %d opening socket.\n", errno);
        return -1;
    }

    return 0;
}
于 2011-11-01T04:47:21.617 に答える
6

Windows ソケットを使用しているため、WSAGetLastError() 関数を使用してエラー コードを確認する必要があります。Windows ソケット関数は errno を設定しないため、値が 0 の errno が表示されます。

この古い MinGW wiki ページには、UNIX ソケットと Windows ソケットの違いのリストがあり、項目 5 で errno と WSAGetLastError() の違いについて言及しています: http://oldwiki.mingw.org/index.php/sockets

于 2011-11-05T14:22:23.833 に答える
3

関数/マクロRDF_LOGは、0 にリセットされている C ランタイム ライブラリ内の他の関数を呼び出している可能性があります。正確であるためには、失敗の直後errnoの値を取得する必要があります。errnosocket

于 2011-11-01T04:46:55.260 に答える
0

これは別の回答で言及されていませんが、上記のコードには別の問題があります。Winsock ソケット記述子は SOCKET 型で、私の MinGW winsock2.h では unsigned int として定義されています。

Winsock ソケットが Unix ファイル記述子のような int 型であると想定している場合、Winsock はソケット記述子の値が正の符号付き整数値にマップされることを保証しないため、負のエラー リターン ステータスをチェックすると、誤ったエラー レポートが返される可能性があります。

ソケット記述子 (socket()、accept() など) を返す Winsock 関数は、代わりに (SOCKET) ~0 として定義されるエラーで SOCKET_INVALID を返します。上記のように、WSAGetLastError() を使用してシステム エラー番号を取得する必要があります。

https://msdn.microsoft.com/en-us/library/windows/desktop/ms740516%28v=vs.85%29.aspx

于 2015-07-22T15:14:22.357 に答える