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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

4回答

2753閲覧

ソケット通信の接続待ち受けについて

morimoriservice

総合スコア23

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/11/19 12:01

現在ソケット通信を用いてデータのやり取りを行うプログラムを作成しております
その際に接続待ち受けというものを行わないと
OSError: [Errno 22] Invalid argument
と表示され実行ができません。
このlistenがどのような役割を担っているのか調べたところ、並列処理の個数を決めるとのことでしたが
消した場合に実行時エラーが出る理屈がわかりません。
どなたか理由をご存じでしたら教えていただけると幸いです。

Python1

1# -*- coding:utf-8 -*- 2import socket 3 4host = socket.gethostname() #ホスト名取得 5port = 8080 #PORT指定(クライアントと一致していればOK) 6 7serversock = socket.socket(socket.AF_INET6,socket.SOCK_STREAM) #オブジェクトの作成 8serversock.bind((host,port)) #IPとPORTを指定してバインドします 9serversock.listen(1) #接続の待ち受けをします(キューの最大数を指定) 10 11print('Waiting for connections...') 12clientsock, client_address = serversock.accept() #接続されればデータを格納 13 14while True: 15 16 #strでクライアントプログラムからの入力を受け取る 17 rcvmsg = clientsock.recv(4096).decode() 18 #入力された文字列がexitであった場合、その時点で処理終了 19 if rcvmsg == 'exit': 20 break 21 22 #数値単独の場合そのまま代入 23 if(str.isdigit(rcvmsg))==True: 24 sndmsg=rcvmsg 25 sndmsg=str(sndmsg) 26 27 clientsock.sendall(sndmsg.encode('utf-8')) #メッセージを返します 28 29#クローズ処理 30print("Now Closing") 31clientsock.close()

Python2

1# -*- coding:utf-8 -*- 2import socket 3 4host = socket.gethostname() #ホスト名取得 5port = 8080 #PORT指定(クライアントと一致していればOK) 6 7client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #オブジェクトの作成 8 9client.connect((host, port)) #これでサーバーに接続します 10 11massage=0 #message初期値 12 13print("計算を行います、終了する場合は'exit'と入力してください") 14 15while massage != 'exit': 16 print("Send Message") 17 18 massage=input() 19 20 #入力ない場合は送信しない 21 if not massage: 22 print("文字を入力してください") 23 else: 24 client.send(massage.encode('utf-8')) #サーバープログラムにデータ送信 25 26 response = client.recv(4096).decode() #サーバーの処理結果受信(レシーブは適当な2の累乗) 27 28 print(response) 29 30print("計算を終了します") 31client.close()

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

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

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

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

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

guest

回答4

0

このlistenがどのような役割を担っているのか調べたところ、並列処理の個数を決めるとのことでしたが消した場合に実行時エラーが出る理屈がわかりません。

出るエラーは
OSError: [WinError 10022] 無効な引数が提供されました。
ですよね?

can110さんの回答にある通り、リファレンスに

listen中である必要があります。

とありますので、
clientsock, client_address = serversock.accept()
を成立させるには、
serversock.listen(1)
が必須です。

恐らく質問は(それは分かるけど)**「無効な引数」ってなんだよ?**ですよね?


socket.pyを覗くと分かりますが、self._accept()の部分の_accept()の処理の中で使われる引数がおかしいのだと思います(が、これ以上ソースを追跡できませんでした)。

投稿2021/11/19 13:06

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

morimoriservice

2021/11/19 13:23

ご回答ありがとうございます。 >恐らく質問は(それは分かるけど)「無効な引数」ってなんだよ?ですよね? 聞きたかったことしてはlistenを使用しなければいけない理由というのがなんとなくでも理解したかったからです。 >とありますので、 >clientsock, client_address = serversock.accept() >を成立させるには、 >serversock.listen(1) >が必須です。 clientsock, client_address = serversock.accept()の成立に必要な条件ということで理解いたしました。 ありがとうございます。
guest

0

TCPソケットはサーバ側が接続待ちを行い、クライアントはそこに接続して初めて通信ができるようになります
そういう通信方式だ、ってことですね

投稿2021/11/19 12:54

y_waiwai

総合スコア88042

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

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

morimoriservice

2021/11/19 13:23

ご回答ありがとうございます。 通信プロトコルがTCPの場合に必要な処理ということで理解いたしました。
y_waiwai

2021/11/19 13:32 編集

TCPは通信内容のエラーチェックも行い、通信切断が起きなければ、データは保証されてます。 これに対し、UDPという通信プロトコルもあって、こいつはデータの保証はない代わりに事前の接続は不要になってます(送りっぱなしの形式) 興味があればそこらへん調べてみては
guest

0

このlistenがどのような役割を担っているのか調べたところ、並列処理の個数を決めるとのことでしたが

全く間違っています。
listenは作成したソケットを使い、指定したポート番号でクライアントからの接続を待ち受け状態にするという役割です。
引数は、accept待ちの待ち行列に並ぶクライアントの最大数です。

投稿2021/11/19 14:47

otn

総合スコア85901

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

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

0

ベストアンサー

Pythonに関する質問ではないですね。

LISTENなどはシステムコールですので、OS関連として質問すべきです。

Linux Programmer's Manual (2) LISTENなどをご覧になれば分かると思いますが、PythonはOSの決めたルールに従って順に呼び出すことを求めているだけです。

OSが

1 sockwtを生成
2 bindでsocketとリソースを紐付け
3 listen で待ち受け

と決めていて、そのとおりしなければOSErrorになるのですから、
疑問があればLinuxとかOSのタグで質問して下さい。

投稿2021/11/19 12:58

ppaul

総合スコア24670

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

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

morimoriservice

2021/11/19 13:20

OS関連の内容になるのですね Pythonのコードで発生したエラーなのでPythonの中で質問してしまいました、、、 この質問としてはlistenを使用する理由というところが知りたかったのですが、 ルールに従って呼び出しているということで理解いたしました。 ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問