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

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

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

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

Q&A

解決済

3回答

6622閲覧

マルチスレッドでソケット通信を行う場合について

ludanac

総合スコア5

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

0グッド

1クリップ

投稿2019/09/16 10:45

編集2019/09/16 10:53

C++でソケット通信を行うサーバープログラムを作っています。
一般的な手順で、ソケットを生成し、接続を確立、クライアントからのメッセージをrecv()で受け付けて処理を行い、send()で返送を行なっているのですが、クライアント側は、複数のスレッドから同時にメッセージを送ってきます。
そのような場合に、recv()では片方しか受け取れないという問題があります。
同じクライアントの複数のスレッドから送信されるメッセージを全て受けるにはどうしたら良いでしょうか。
なお、現在はシングルスレッドでrecv()して処理してsend()までを行なっています。

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

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

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

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

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

guest

回答3

0

自己解決

accept()した後に別スレッドでそれぞれ処理を行うようにしたら解決しました。(forkでもok)
クライアント側の2つのスレッドの両方から同じアドレス&ポート情報で接続を行なっていたみたいです。

投稿2019/09/19 10:05

ludanac

総合スコア5

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

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

0

並行して処理する必要がないのなら、そのままでいいし、並行して処理する必要があるなら、サーバー側もマルチスレッドにするか、マルチプロセスにする必要があります。

投稿2019/09/16 11:08

otn

総合スコア84538

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

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

ludanac

2019/09/16 11:26

回答ありがとうございます。 初心者なのでよくわかってないのですが、並列で処理したら良い場合かどうかはどのように判断しますか?
guest

0

複数のスレッドから同時にメッセージを送ってくると言っても、そのメッセージは順番に送られてきますんで、メッセージが来るのを順番に処理していけばいいと思います

現状の処理ではなにか不具合があるんでしょうか。

投稿2019/09/16 10:58

y_waiwai

総合スコア87774

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

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

ludanac

2019/09/16 11:21

回答ありがとうございます。 私も順に来ると思っていたのですが、片方はどこかへ消えてしまっています。 以下、問題の通信例ですが、③と④のところでメッセージが片方しか受け取れないのです。 <通信例> ①クライアント:メッセージAを送信 ②サーバ:メッセージAを受信 ③クライアント:メッセージBとCを同時に送信 ④サーバ:メッセージBまたはCのどちらか一方のみ受信 ⑤クライアント:メッセージDを送信 ⑥サーバ:メッセージDを受信
y_waiwai

2019/09/16 11:45

片方しか受け取れないというのは、なにかバグが有るってことでしょう。 決してマルチスレッドにしてないから、ではないです。 パケットキャプチャソフトなどで、実際にどういうパケットが流れているか確認してみればどうでしょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問