2016-04-13 10 views
0

読んでいただきありがとうございます。私は現在、linuxを使用しているCのソケットサーバー用のサーバーとクライアントの両方を実装しています。現在、私はサーバーとソケットの両方がユニークなメッセージを送ることができ、もう片方のエンドは正しい長さのメッセージを受け取る、働く "チャット"システムを持っています。ループの受信数が不明なソケットサーバ

出力例:

Server side 

You:Hello! 
client:hi, how are you? 
You: fine thanks. 
client: blabla 

..Andクライアント側は次のようになります。

server: Hello! 
you:hi,how are you? 

などなど

私の質問は、のためにどのような方法があるとされますクライアント/サーバーが他の応答の前に複数のメッセージを送信できるようにするには?

私は現在、受信を待ってから送信を続ける無限のwhileループを持っています。これは接続が失われるまで繰り返されます。私は受信を待つことを強制される前に、私はこのメッセージを送信することができます。私はまだソケットとCの両方に全く新しいので、正しい実装についてはわかりません!ありがとう:)

+0

あなたが求めていることはまったく明確ではありません。受信を試みる前に複数のメッセージを送信するだけで、どちらの側が停止するのでしょうか? –

+0

これを構造化する一般的な方法は、複数のスレッドを使用することです。 1つのスレッドが端末から読み取り、ユーザーが接続に入力したものを送信し、もう1つのスレッドは接続から読み取り、出力を表示します。 – Barmar

+0

これを行う別の方法は、 'select()'または 'poll()'を使用して、端末とネットワークの両方からの入力を1つのスレッドで同時に待つことです。 – Barmar

答えて

1

はい可能性があります。 コードの本体は、データのソケットで待機しません。データがすでに存在する場合は、ソケットを読み取ります。選択機能を使用することで可能です。 selectコールの後、受信したメッセージを表示するためにソケットを読み取り、入力可能な状態になっている場合は、他のピアにユーザメッセージを送信します。

+0

selectで1分間ブロックしたとすると、ソケットの受信メッセージは1分後に表示されます。私が言いたいのは。 –

+0

ありがとうございます。私は間違っていた、それはタイムアウトです。 –

+0

スレッドを使うつもりならば、 'read'や' recv'でブロックするスレッドを1つしか持たないのはなぜですか?なぜ他に何もしないスレッドに 'select'を使うのですか? –

0

一般的な解決策:スレッドを使用する必要があります。受信側の部分を別のスレッドで実行することを提案します。

したがって、最初にメインスレッドをにコーディングしてください。は、アプリケーションがまったく受信できないかのように送信を管理します。どうやらあなたは編集フィールドをどこかに持っています(そして何とかmessgaeループがあります)。ユーザーがEnterキーを押すたびに、Editフィールドのコールバック関数内からSendが送信されます。

次に、別スレッドをコードし、Receive()を呼び出してブロックします。 Receiveが "スリップオン"するたびに(データが入った)、データで何かをした後、Receiveエントリポイントに戻ります。これは、ソケットを終了するまで、または他の手段で、実際にReceiveエントリポイントにジャンプしないことを決定するまで続きます。

2つのスレッドが互いに接触する状況は、両方が同じチャットウィンドウにテキストコンテンツを書き込む場合です。両者は、送信が行われると直ちにそれを行うが、潜在的に両方が潜在的に同じ時刻にチャットウィンドウにアクセスしようとし、クラッシュを引き起こす可能性がある。したがって、ここではロック機構を適用します。最初にチャットウィンドウにアクセスしようとするのは「取得する」一方、ロック機構は、最初にロックを解除するまで他のロックを保持したままにします。それから、もう1つは仕事をすることができます。結局のところ、ロックはマイクロ秒の問題でしかない。

これらは即時の行動であり、互いに自由です。複数のメッセージをキューに入れる必要はありません。それぞれが "それが起こるように"処理されます。

関連する問題