1. ホーム
  2. c

[解決済み] C言語でのソケット以外のエラー時のソケット操作

2022-02-18 04:19:10

質問

私はソケットプログラミングの初心者です... このサーバーサイドのプログラムを試してみました

#define BUFLEN 512
#define MYPORT 3456
void errorp(char* msg)
{
        perror(msg);
        exit(1);
}

int main()
{
        struct sockaddr_in server, client;
        int sock;
        int slen = sizeof(server);
        int clen = sizeof(client);
        char *recvbuf, senbuf[BUFLEN] = {'h','e','l','l','o'};

        if((sock = socket(AF_INET, SOCK_DGRAM, 0) == -1))
                errorp("Socket creation failed");


        printf("To the client: %s, %s", senbuf, " World");
        bzero(&server, sizeof(server));

        server.sin_family = AF_INET;
        server.sin_port = MYPORT;
        server.sin_addr.s_addr = inet_addr("127.0.0.1");
        if(bind(sock, (struct sockaddr*)&server, slen)==-1)
                errorp("Socket Bind Failed");
        if(recvfrom(sock, recvbuf, sizeof(recvbuf), 0, (struct sockaddr*) &client, &clen) == -1)
                errorp("recv from error");
        printf("From the client: %s", recvbuf);

        if(sendto(sock, senbuf, sizeof(senbuf), 0, (struct sockaddr*) &client, sizeof(client)) == -1)
                errorp("Error in sending");

        printf("To the client: %s", senbuf);
        close(sock);
        return 0;
}

コンパイルエラーはありませんが、出力は

Socket Bind Failed: Socket operation on non-socket
To the client: hello,  World

どこが間違いなのか、ご教授ください。 そして、それを取り除く手助けをしてください。

解決方法は?

エラーメッセージが全てを物語っています。ソケットが(有効な)ソケットではありません。

これで、ソケットを作成するコードに目を向けるようになるはずです。

if((sock = socket(AF_INET, SOCK_DGRAM, 0) == -1))

上記のコードでは、1回目に socket()-1 と比較し、その結果を sock . つまり、次のどちらかです。 0 または 1 . そして、その呼び出しの結果 socket() が失われる。

このようなコードにする。

if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)

として == は、より強固に結合されます。 = .


ちなみに ヨーダコンディトライ があれば、このようなtypo"typo;は避けられたと思います。

if (-1 == (sock = socket(AF_INET, SOCK_DGRAM, 0)))


また、少なくとも clen は型でなければならない socklen_t のアドレスが渡され、そこに値が書き込まれるのですが、もし期待されるサイズの socklen_t とは異なります。 int (表示されたコードはパスします)。