質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

解決済

c言語 socket bind()の順により発生するpermission denied とは

akiyama3284pga
akiyama_pga

総合スコア186

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

1回答

0グッド

1クリップ

483閲覧

投稿2022/08/06 03:47

編集2022/08/06 12:03

以下のように、ワイルドカードを指定したソケットと、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 }

この理由を知りたいと思います。
よろしくお願いいたします。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

1

ベストアンサー

誰も回答ないので。はずしてたらごめんなさい。
htonl(INADDR_ANY)ですべてのアドレスにバインドしたので、127.0.0.1とはバインドできないんじゃないですかね?

投稿2022/08/08 02:40

pochi0701

総合スコア208

akiyama_pga👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

akiyama3284pga

2022/08/08 02:51 編集

御回答ありがとうございます。 その通りでした。WSLという曖昧な環境で行っていたことが原因となっており、Ubuntuで実行しますと、 addrss already in use となりました。 一つお聞きできたら助かるのですが、 バインドできないのは、bind()という関数が同じものが無いかはチェックするからという理由で、 設計的には同アドレス、同ポートでソケットを作成できなくはない。という認識でよろしいでしょうか? 例えば、 ソケ1 local addr * local port 8888 ソケ2 local addr 188.22.22.3 local port 8888 この状態はソケ1からaccept()で新しくソケ2が作成される際になる状況だと思うのですが、設計的にできないというのであればこの状況は成立しないと思います。(なので、設計的には同アドレス、同ポートでソケットを作成できなくはないと,,,,)
pochi0701

2022/08/08 02:59

BINDはできないんじゃないかなぁ。同じポートで待ちたいんだったらLISTENとかACCEPT後にアドレス調べたらいいんじゃないですかね。たしかlistenはスレッドセーフだったような。
akiyama3284pga

2022/08/08 03:29

ありがとうございます。 もう少し深堀してみたいと思います。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。