0

私は他の言語でソケットプログラミングを行ったことがありますが、C で直接行うことはありませんでした。Windows でポート 8080 をリッスンする単純なサーバーをセットアップしようとしています。mingw に付属の gcc を使用してコードをコンパイルしています。



    #include <stdio.h>
    #include <string.h>
    #include <WinSock2.h>
    #include <stdint.h>
    #include <time.h>

        int main(void) {

        int s;      
        int len;
        char  buffer[1025];  
        struct sockaddr_in servAddr; 
        struct sockaddr_in clntAddr; 

        int clntAddrLen; //length of client socket addre

    //Build local (server) socket add

        memset(&servAddr, 0, sizeof(servAddr));
        servAddr.sin_family = AF_INET;
        servAddr.sin_port = htons(8080);
        servAddr.sin_addr.s_addr = htonl(INADDR_ANY);

       //create socket
        if((s=socket(AF_INET, SOCK_STREAM, 0) %lt; 0 )){
            perror("Error: Socket Failed!");
                printf("%d\n", errno);
            exit(1);
        }

    //bind socket to local address and port
        if((bind(s,(struct sockaddr*)&servAddr, sizeof(servAddr)) %lt; 0))
        {
            perror("Error:bind failed!");
                printf("%d\n", errno);
            exit(1);
        }

        for(;;)
        {
            len = recvfrom(s,buffer, sizeof(buffer),0,(struct sockaddr*)&clntAddr, &clntAddrLen);

            //send string
            sendto(s, buffer, len, 0, (struct sockaddr*)&clntAddr, sizeof(clntAddr));
        }

    }


コードを実行すると、バインディングでエラーが発生しますが、エラーはありません。このコードは、このスレッドから取得され、わずかに変更されています: Windows Socket Programming in C

しかし、エラーコードはありません。出力には、エラーがないことが表示されます。バインドで失敗しますが、その理由はわかりません。いくつかのソースをまとめてみました。私は文字通り、Windows 上の C で hello world/3 ウェイ ハンドシェイクを実行できるものが欲しいだけです。

前もって感謝します。

4

1 に答える 1

1

演算子の優先順位により、これは正しくありません:

if((s=socket(AF_INET, SOCK_STREAM, 0) < 0 )){

as<は よりも優先順位が高くなり=ます。これは、コードが の結果に応じて1または0を割り当てることを意味します。への変更:ssocket(AF_INET, SOCK_STREAM, 0) < 0

if((s=socket(AF_INET, SOCK_STREAM, 0)) < 0 ){

WSAGetLastError()ではなく、失敗の理由を取得するために使用しerrnoます。MSDNbind()リファレンス ページから:

エラーが発生しない場合、bind は 0 を返します。それ以外の場合は SOCKET_ERROR を返し、WSAGetLastErrorを呼び出すことで特定のエラー コードを取得できます。

Windows ではWSAStartup()、ソケット関数が呼び出される前に呼び出す必要があります。

于 2013-04-03T20:25:17.990 に答える