4

socketgdbで突然クラッシュします (ただし、正常に動作します)。これは、winsock を初期化した場合にのみ発生します。どんな助けでも大歓迎です。

#include <stdlib.h>
#include <stdio.h>
#include <locale.h>

#include <winsock2.h>
#include <Iphlpapi.h>
#ifdef _MSC_VER
    #pragma comment(lib, "ws2_32.lib")
    #pragma comment(lib, "IPHLPAPI.lib")
#endif
#include <windows.h>

unsigned char Network_isInitialized_ = 0;

#define SYSTEMINFORMATION_ISNATIVEWINDOWS 1

unsigned char Network_init_(){
#if SYSTEMINFORMATION_ISNATIVEWINDOWS
    if (Network_isInitialized_){
        return Network_isInitialized_;
    }
    WSADATA wsadata;
    int error = WSAStartup(0x0202, &wsadata);
    Network_isInitialized_ = error == 0 ? 1 : 0;
    return Network_isInitialized_;
#else
    return 1;
#endif
}

void Network_shutdown_(){
#if SYSTEMINFORMATION_ISNATIVEWINDOWS
    if (Network_isInitialized_){
        WSACleanup(); //Clean up Winsock
    }
    Network_isInitialized_ = 0;
#else
    //Unix doesnt need to do anything
#endif
}


typedef struct TCP_Connection_s {
    char *name;
    int port;
    unsigned int ip;

    struct sockaddr_in *connection;
    void *ptr;
    unsigned int socket;
} TCP_Connection;

TCP_Connection* TCP_Connection_malloc(){
    TCP_Connection *connection = (TCP_Connection*)malloc(sizeof(TCP_Connection));
    memset(connection, 0, sizeof(*connection));
    connection->connection = (struct sockaddr_in*) malloc (sizeof(struct sockaddr_in));
    memset(connection->connection, 0, sizeof(*connection->connection));
    return connection;
}

TCP_Connection* myconnect(TCP_Connection *connection){
    if (connection == NULL){
        return NULL;
    }
    connection->socket = socket(AF_INET, SOCK_STREAM, 0);
    if (connection->socket+1 == 0){
        return NULL;
    }
    int ret = connect(connection->socket, (struct sockaddr *)connection->connection, sizeof(*connection->connection));
    if (ret != 0){
        return NULL;
    }
    return connection;
}

TCP_Connection* connectToHost(TCP_Connection *connection, char *address, int port){
    if (address == NULL){
        return NULL;
    }

    if (connection == NULL){
        connection = TCP_Connection_malloc();
    }

    struct hostent *he = (struct hostent *) gethostbyname(address);
    int retryCount = 5;
    while (he == NULL && retryCount > 0){
        he = (struct hostent *) gethostbyname(address);
        Sleep(2000);
        retryCount = retryCount - 1;
    }
    if (he == NULL){
        return NULL;
    }
    struct sockaddr_in temp;
    memcpy(&(temp.sin_addr), he->h_addr, he->h_length);

    connection->connection->sin_family = AF_INET;
    connection->connection->sin_addr.s_addr = INADDR_ANY;
    connection->connection->sin_port = htons(port);
    connection->port = port;

    memcpy(&(connection->connection->sin_addr), he->h_addr, he->h_length);
    return myconnect(connection);
}


int main(int argc, char *argv[]){
    //Random_seedCryptographic();
    Network_init_();
    connectToHost(NULL, "localhost", 1337);
    Network_shutdown_();
    printf("Press any key to continue...");
    fflush(0);
    getchar();
    return 0;
}
$ gdb test.exe
GNU gdb (GDB) 7.3.50.20111026-cvs (cygwin スペシャル)
Copyright (C) 2011 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 以降
これはフリー ソフトウェアです。自由に変更して再配布してください。
法律で許可されている範囲で、保証はありません。「コピーを表示」と入力します
詳細については、「保証を表示する」を参照してください。
この GDB は「i686-cygwin」として構成されました。
バグ報告の手順については、次を参照してください。
...
/cygdrive/c/test.exe からシンボルを読み取り中...完了。
(gdb) 実行
起動プログラム: /cygdrive/c/test.exe
[新規スレッド 201280.0x60b68]
dll パスが長すぎます
[新規スレッド 201280.0x304b0]
警告: //./globalroot/systemroot/syswow64/mswsock.dll の共有ライブラリ シンボルを読み込めませんでした。
「set solib-search-path」または「set sysroot」が必要ですか?

プログラム受信シグナル SIGTRAP、トレース/ブレークポイント トラップ。
0x3567125a in ?? () /cygdrive/c/Windows/syswow64/mswsock.dll から
(gdb) ところで
#0 0x3567125a で ?? () /cygdrive/c/Windows/syswow64/mswsock.dll から
#1 /cygdrive/c/Windows/syswow64/WS2_32.dll からの inet_ntoa () の 0x753b8b9d
#2 /cygdrive/c/Windows/syswow64/WS2_32.dll からの inet_ntoa () の 0x753b8972
#3 /cygdrive/c/Windows/syswow64/WS2_32.dll からの inet_ntoa () の 0x753b89da
#4 WSCInstallProvider の 0x753b3d70 ()
   /cygdrive/c/Windows/syswow64/WS2_32.dll から
#5 0x00000002 in ?? ()
#6 0x00000001 in ?? ()
#7 0x00000000 in ?? ()
(gdb)

更新: mingw ポータブルの下で別のシステムで同じファイルをコンパイルしようとしましたが、うまくいきました。次に、システムにmingwをインストールして、cygwinをアンインストールしようとしました...まだ動作しませんXD

4

1 に答える 1

0

これは、Cygwin が UNIX 環境をエミュレートしようとするためであり、UNIX で呼び出す必要はありませんWSAStartup()。Cygwin は内部でこれを自動的に行うため、Winsock の初期化/クリーンアップを複製しています。たとえば、これを参照してください。

于 2013-09-16T12:43:57.240 に答える