Q&A
以下のように、ワイルドカードを指定したソケットと、127.0.0.1を指定したソケットを
それぞれ同ポートにバインドします。
ワイルドカードと単体アドレスであれば、同アドレス・同ポートが完全一致しても、
ワイルドカードが少ない方のsocket構造体が選択されるような仕組みのため、同居が許されていると学びました。
しかし、
#include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main(){ int Sock; // int Sock2; // struct sockaddr_in ServerAddr; struct sockaddr_in ServerAddr2; unsigned short ServerPort; unsigned short ServerPort2; ServerPort = 7111; ServerPort2 = 7111; if ((Sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){ printf("socket() できません"); } if ((Sock2 = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){ printf("socket() できません"); } memset(&ServerAddr, 0, sizeof(ServerAddr)); ServerAddr.sin_family = AF_INET; ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY); ServerAddr.sin_port = htons(ServerPort); memset(&ServerAddr2, 0, sizeof(ServerAddr2)); ServerAddr2.sin_family = AF_INET; ServerAddr2.sin_addr.s_addr = htonl(0x7F000001); // 127.0.0.1 ServerAddr2.sin_port = htons(ServerPort2); // ★ if (bind(Sock, (struct sockaddr*)&ServerAddr, sizeof(ServerAddr)) < 0){ printf("bind() できません"); } if (bind(Sock2, (struct sockaddr*)&ServerAddr2, sizeof(ServerAddr2)) < 0){ printf("bind() できません"); } close(Sock); close(Sock2); return 0; }
★の部分ですが、下のように"先に"Sock2をbind()しますと、なぜかSockをbind()する際に、
Permission Deniedエラーが発生します。
if (bind(Sock2, (struct sockaddr*)&ServerAddr, sizeof(ServerAddr)) < 0){ printf("bind() できません"); } if (bind(Sock, (struct sockaddr*)&ServerAddr2, sizeof(ServerAddr2)) < 0){ printf("bind() できません"); // Permission Denined }
この理由を知りたいと思います。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2022/08/08 02:51 編集
2022/08/08 02:59
2022/08/08 03:29