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

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

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

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

Q&A

解決済

1回答

1148閲覧

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

akiyama3284pga

総合スコア186

C

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

0グッド

1クリップ

投稿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 }

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

投稿2022/08/08 02:40

pochi0701

総合スコア210

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問