🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1843閲覧

python recvfrom_intoについて

succulent

総合スコア12

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2020/12/08 07:06

編集2020/12/08 07:06

#やりたいこと
UDPでsocket通信させたいです.
recvfrom_into()でヘッダのみを読み込みたいのですが,エラーが出てしまいます.
ご回答よろしくお願いします.

#エラー

Traceback (most recent call last): File "server_udp.py", line 17, in <module> recvfrom_into(recv_data, recv_header.length) NameError: name 'recvfrom_into' is not defined

#サンプルコード

import socket from ctypes import * MYADDR = "127.0.0.1" MYPORT = 50002 BUFSIZE = 1024 class MessageHeader(Structure): _fields_ = [ ('type', c_uint8), ('length', c_uint16), ] if __name__ == "__main__": s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind((MYADDR, MYPORT)) while True: recv_header = MessageHeader() nbytes, addr = s.recvfrom_into(recv_header, sizeof(MessageHeader)) recv_data = b'' recvfrom_into(recv_data, recv_header.length) print(recv_data.decode() + "\n")
teamikl👍を押しています

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

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

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

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

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

guest

回答2

0

バイトオーダーが環境依存になるので Structure の代わりに
BigEndianStructure / LittleEndianStructure を使いましょう。
簡易的には struct モジュールも使えます。

バイトオーダが異なる場合、読みだしたデータの値が期待通りではなくなります。


エラーの原因については、recvfrom_into -> s.recvfrom_into ですが
2回めの方は、使い方にも誤りがあります。

引数に指定するのは、「予めメモリを確保した」「書込み可能な」バッファーです。
bytes オブジェクトは読み出しのみなので、ここでは bytearray 等を用います。

若しくは、固定長データの読み出しではないので recvfrom_into ではなく
バッファの確保を読み出しメソッドに任せて recvfrom で
任意の長さのバイトを読み出しでも良いです。


戻り値の確認

必ずメソッドの戻り値の送信した・受信したバイト数を確認。
ローカル環境でのテストでは再現しないことが多い。

また、UDPではパケットの到達保証がありません。送信側次第ですが、
順序も保証されないので、TCPのように ヘッダ部分の後にデータ本体を読み込む
みたいな事は成立しないケースもあります。

投稿2020/12/08 08:06

teamikl

総合スコア8742

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

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

succulent

2020/12/08 12:45

ご丁寧に解説して頂きありがとうございます! ご指摘の通り,baffer typeでエラーに遭遇しておりました...加えて感謝いたします. 追加での質問なのですが,受信を続けて書いた場合clientの送信の度に1つのrecvしか動作しないのですが,Client1度の送信でヘッダを受信したのちデータも受信するにはどうしたらよいでしょうか? ``` #現状 (server terminal) 46 # client 送信 (header表示) "test" # client 送信2回目 (data表示) # やりたいこと 46 # client 送信1回目 "test" 46 # client 送信2回目 "test" ```
teamikl

2020/12/08 12:50

別の質問にも回答を書いたのですが、 それをするには TCP を使いましょうってなってきます。 UDP では到達順序なども保証されません。 送信パケットを分割した場合 header の後に data が届くとは限らない。
succulent

2020/12/08 12:56

複数の質問への回答,本当にありがとうございます. 今回はheaderとdataを分割せず1つのパケットとして送信しています.その場合も順序は変わってくるのでしょうか?
teamikl

2020/12/08 13:17 編集

1つのパケットなら中のデータの順序が変わるようなことはありません。 パケットが届くかどうかはともかく、 チェックサムがあるので、パケット単位での中のデータは保証されます。 同じパケットなら、予め大きめのバッファサイズを指定して読み出し、 独自にバッファリングをするといった対応が必要です。(UDPの場合) 一度目の recvfrom でヘッダ部分のみを読み出すと、残りのdata部分は破棄されてます。
succulent

2020/12/08 13:17

確認したところ 1 # client 送信1回目 (header:1, data:aa) bb # client 送信2回目 (header:2, data:bb) となっていた原因が理解出来ました. recvfromでまとめて受信してから,headerとdataを分けたいと思います.
guest

0

ベストアンサー

NameError: name 'recvfrom_into' is not defined

というエラーについてですが、

recvfrom_into(recv_data, recv_header.length)

は正しくは

s.recvfrom_into(recv_data, recv_header.length)

ではないでしょうか。

投稿2020/12/08 07:14

sfdust

総合スコア1137

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

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

succulent

2020/12/08 07:49

ありがとうございます!こんなミスで失礼しました...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問