Winsockコントロールの送受信について


秋刀魚  2002-11-29 16:34:09  No: 76478  IP: [192.*.*.*]

Winsockコントローラを使用して画像データを送受信できるプログラムを作ろうと考えています。
送信側は
WinSocke.SendData send '□命令送信
WinSocke.SendData binfo()'□BITMAPINFO送信
WinSocke.SendData lpBmpData() '□BIMAPDATA送信

※sendはLong型
  binfo・lpBmpdataはByte型配列です
このような感じで送っています。
過去Logを見たのですが送信は1回で8kbしか無理なんでしょうか?
lpbmpdataは300Kbほどあります。

受信側ですが、受信側も1回で8kbほどしか受信できないみたいでどう受信すればよいか悩んでいます。
分割で画像だけを受信すればいいのかもしれませんが
WinSocke.SendData send '□命令送信
によって送られる命令によって、画像であったり、文字列であったりといろいろ区別できるようにしているので余計にわけがわからなくなっています。

もし、何か言い方法などがありましたら教えてもらえませんでしょうか?
よろしくお願いします。

編集 削除
YuO  2002-11-29 18:19:06  No: 76479  IP: [192.*.*.*]

えーっと,IPヘッダによる制限でパケットの最大の大きさは64KBです。
#IPヘッダ中にあるパケットサイズのフィールドが2octet分しかないので。
ので,IPを使う以上,分割されるのは仕方がないです。
#8KBはTCPの実装制限でしょう。

WinSockを直に叩いてみるのはどうでしょう。
送信バイト数がちゃんと取得できます。
受信側は……どうしようもないです。
WinSockを直に利用しても分割されてくるものは分割してしか受信できませんから。

編集 削除
秋刀魚  2002-12-01 16:38:32  No: 76480  IP: [192.*.*.*]

返事ありがとうございます。
Winsockを直にたたくということは・・APIを利用するということでしょうか?

編集 削除
YuO  2002-12-02 20:29:33  No: 76481  IP: [192.*.*.*]

WinSock コントロールを使って実際に調べてみましたが,

Private Sub Command1_Click()
    Winsock1.Connect "127.0.0.1", 32000
End Sub

Private Sub Winsock1_Connect()
    Dim data(1024& * 256 - 1) As Byte

    Winsock1.SendData data
End Sub

Private Sub Winsock1_SendComplete()
    Winsock1.Close
End Sub

というプログラムで,確かに256KB送られています。
#8KBごとに分割されてはいましたが。
受信側はVC++でrecvの戻り値を使って受信バイト数を調べました。

なので,送信側は一発で送ってしまって問題ないです。
受信側は分割されたり複数のパケットがまとまってくることを前提に組むしかないです。
また,それを可能にするための送信側の配慮も必要です。

編集 削除
秋刀魚  2002-12-03 13:33:19  No: 76482  IP: [192.*.*.*]

一度この方法でやってみます。
ありがとうございました♪

編集 削除