• ベストアンサー

ネットワークプログラミングについて

このたびWinSock2を使用し、ネットワークゲームを制作している者ですが、分からないことがあるので質問します。 通信はTCPで行っていて、メッセージはウィンドウのコールバックに渡しているのですが、連続でSendすると最初のメッセージしか届いていないようです・・・ 特にエラーは出ていないようですし、原因が分からなくてこまっています。あらゆる条件で行いましたが同じでした。 連続でSendというのは、 send("a",2,0); send("b",2,0); send("c",2,0); というようにです。 一定の間隔をあけて送信すればちゃんと届くのですが・・ これは仕様で仕方がないのでしょうか・・・ とてもこまっています、どなたか回答をお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

send("a",2,0); send("b",2,0); send("c",2,0); これを常に3回のrecvで受け取ると考えていまえんか? そうではありません。 連続で送ったなら recvで受け取ったとき "a(NULL)b(NULL)c(NULL)" と3回のsendで送ったデータ全てが1回のrecvで来ている可能性があります。 recvの戻り値には何バイト受け取ったかが入っているので今回の場合 それが2バイトではなく、6や4が入っている可能性があるので確かめてください。

genki140
質問者

お礼

本当です、できました! そうやってどんどんたまっていくんですね^^; ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

APIの返値をすべてチェックしても、エラーは返っていないのですね? それであれば、たとえば連続して send("a",2,0); send("b",2,0); send("c",2,0); を行ったときに、受け取り側には { 'a', 0, 'b', 0, 'c', 0 } の6バイトがまとめて届いている、あるいは最初の2バイトに続けて残りの4バイトが届いているということはないでしょうか。(SOCK_STREAMを使う場合、送信したデータと同じ区切り方でデータが受信されるとは限りません。)

genki140
質問者

お礼

分かりやすい回答ありがとうございました、おかげで無事解決しました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • TCP/IP通信プログラミングにおけるデータ送信タイミングと受信データ処理のタイミングについて

    現在Winsockを用いてTCP/IPメッセージ通信を行うプログラムを作成 しています。 メッセージはヌル文字区切りで送信され、ヌルが発見されると一つの メッセージの終わりということにしてあります。 このメッセージを時間ウェイトを入れずに連続して送信すると受信側で 正常にデータが受信できず、送信したデータの一部しか受信できません。 ある程度の時間ウェイトを入れてやることで正常に送受信できるように なります。 受信側の処理において、recvでデータを取得した後にメッセージパーズ 処理を入れているのですがそれほど重い処理でもありません。いろいろ 調べたのですが正常に送受信するときとしないときの違いが連続送信時 に入れる時間ウェイトにあるということしかわかっておりません。 これがTCP/IPの特性なのか私の開発環境(PC・ネットワーク)に起因する ものなのかがわかりません。どなたかこういった現象についてご経験を お持ちの方がおられましたらご教授願いたいと思っております。 以上

  • WinSock プロトコルスタックバッファについて

    開発環境 XP、VC2005、C/C++、WinSock WinSockでネットワークプログラミングをしています。 例えば、下記のようなコードでデータを送信するとします。 int send_byte = send(socket, buf, byte, 0) このとき、変数byteには1024が入っているとします。 上記のコードをループさせてデータを送信すると、 しばらくsend_byteには byteと同じ値1024が入っています。 でも、プロトコルスタックバッファが満杯になり、 send()が処理しきれなくなった場合に、 byteは1024なのに、send_byteが例えば500などになります。 つまり、中途半端に送信してしまいますよね。 これはWinSockの仕様だと思いますが、 できれば中途半端には送信したくないのです。 このように中途半端に送信しない方法はあるでしょうか? send()するまえにプロトコルスタックバッファの空きが調べられれば なんとかできそうな気もするのですが・・・。 よろしくおねがいします。

  • VB2008でネットワーク通信

    VB2008でネットワーク通信 今VB2008を使ってゲームを作ってます。 そこでPC同士をつないで対戦するようにしたいのですが 調べてみるとTCP/IPやWinsockなどが出てきました それがVB6.0のだったり、コードを入れてもうまくいきませんでした。 ちなみにゲームは五目並べで、チャット機能も入れたいと思っています。 ご教授お願いします。

  • ゲームプログラミングのネットワーク対戦

    毎回、お世話になっています。 開発環境:Visual Studio 2005 Visual C++ 開発言語:C/C++ + Win32API + DirectX9 現在、上記の環境・言語でゲームプログラムを作成中です。 そのゲームに、ネットワーク対戦を導入したいと思っています。 そこで質問なのですが、どのように実装すればよいでしょうか? 質問が非常に抽象的で申し訳ないのですが、まずは、DirectPlayやWinSockなどのライブラリの中で、何を使えばいいのか、をアドバイスしていただければと思います。 また、出来ましたら簡単に仕組みを解説していただければ幸いです。 その後、具体的な導入方法について自身で調べてみることにします。 通信の特徴として、 ・1vs1の通信対戦 ・一回のデータ量は少ないが、ほぼリアルタイムに送信 という感じです。 ネットワークプログラミングにはあまり触れたことがないこともあり未熟な身ですが、ご存知の方がいましたらご教授よろしくお願いします。

  • 単純なループバック通信ができませんでした。

    急にネットにつながらなくなりました。 毎日一定時間ネットに繋げてると起こるような気がします。 単純なループバック通信ができませんでした。エラーは 10055 というエラーが出ました。 info すべての基礎サービス プロバイダが Winsock カタログに存在します。 info Winsock サービス プロバイダのチェーンは有効です。 error プロバイダ エントリ MSAFD Tcpip [TCP/IP] は、単純なループバック通信ができませんでした。エラーは 10055 です。 info プロバイダ エントリ MSAFD Tcpip [UDP/IP] はループバック通信テストに合格しました。 info プロバイダ エントリ MSAFD Tcpip [TCP/IPv6] はループバック通信テストに合格しました。 info プロバイダ エントリ MSAFD Tcpip [UDP/IPv6] はループバック通信テストに合格しました。 info プロバイダ エントリ RSVP UDP Service Provider はループバック通信テストに合格しました。 error プロバイダ エントリ RSVP TCP Service Provider は、単純なループバック通信ができませんでした。エラーは 10055 です。 error インストール済みの LSP に接続の問題があります。 action 自動修復: WinSock カタログをリセットする action 成功: netsh winsock reset catalog info システムの再起動が必要です コマンドプロンプトで「netsh winsock reset」を実行して再起動すると正常に戻ります。 エラーがでなくなるようにする方法はありますでしょうか? また、pingはとおるのでいまいちどこに問題がるのかわかっていません。 サーバーとして、運用しているWindowsWebSserver2008でも同様の問題が週一くらいで起こります。

  • ソケット通信の送受信遅延

    MFCのCAsyncSockを使ってクライアントとサーバでメッセージの送受信をしています サーバからsend()でメッセージを送信し クライアントはOnReceive()の中でreceive()し メッセージを受信後、応答をsend()で返信します これを10msec間隔で行っているのですが ランダムに送信か受信で300msec前後の遅延が発生します なぜでしょうか? ちなみにソケットオプションで「TCP_NODELAY」を設定しています かなり困っています 気になることでも何でもいいので是非アドバイスをお願いします

  • Windows3.1でwindowsNTとTCPIPネットワーク通信するには・・・

    windows3.1でsocket通信をするにはWinsock.dllがいると聞ききました。 MSDOS TCPIP for Lanmanというのがいるんですか? windowsNTseverのインストールCDに入っているそうですが、どこにどのような名前ではいってるんでしょうか?またどのようにしたらwindows3.1でWindowsNTのネットワークに接続できますか?教えてください。 OSはPCDOS7.0でwindows3.1をのせています。PCはIBMのPC300PLです。 windowsは95からしか使ったことがなく、3.1のことがよくわかりません。 3.1のコンパネにはネットワークのアイコンがでてこず、 『ネットワークソフトウェアが実行されていません』とメッセージがでます。 やはりWinsock.dllがdosにないからですかね・・・。 どうぞよろしくお願いしま~す。

  • ネットワーク初心者です。

    ネットワーク初心者です。 borland C++でプログラム作成しているのですが、windowsクライアントからサーバーに対してソケットを生成して(c言語)、ファイルをhttp通信で送信したいんですが、うまくいきません。とりあえず、ソケット生成とサーバーcgiプログラムを呼び出すことは出来たんですが、それに対してhttpでファイルを送信するには、どうすればいいのでしょうか? 誰か、ご教授願えますか? ちなみに、サーバーcgi呼び出したのは、 sprintf(send_buf, "POST %s http/1.0\r\n\r", path); send(s, send_buf, strlen(send_buf),0); sprintf(send_buf, "Host: %s:%d\r\n", host, port); send(s, send_buf, strlen(send_buf), 0); sprintf(send_buf, "\r\n"); send(s, send_buf, strlen(send_buf), 0); です。

  • C#でUDP通信

    C#でネットワークプログラミングを行いたいと思っています。 使用するプロトコルはUDPです。 TCP通信の参考書やwebページは見掛けるのですが UDPに関する資料はなかなか見つけることができません。 コーディングする上で、 TCP通信のプログラムをどのように変えたらよいのか 教えてください。 ちなみに、Windowsで開発する場合は WINSOCKを使ったほうがよろしいのでしょうか。

  • ソケットを使ったTCP通信

    はじめまして. 最近ネットワークの勉強を始めた学生です. ソケットを使ったTCP通信について質問させてください. クライアント側はsocket(), connect()でコネクションを確立した後に何回か連続してsend(), recv()を行いたいのに,サーバ側がファイアウォールや侵入検知システムを使って途中で通信を終了するようにしてしまっている場合,クライアント側は再びコネクションを確立させなければ全てのsend()を行うことはできないのでしょうか? よろしくお願いします.