アプリ版:「スタンプのみでお礼する」機能のリリースについて

Winsockを使用してデータの受信プログラムを作成していまが、以下の問題が出ています。
D/F/Hパソコンでテストを行うと1884バイトを一括で受信(GetData)できるのですが、HPパソコンで同じプログラムを動作させると1024バイトで分割されて受信されます。
バイト数は
 Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long
で取得しています。

1.Winsockで最大何バイトまで受信できるのでしょうか?
2.上記HPパソコンでどこか設定があるのでしょうか?

以上。よろしくお願いします。

A 回答 (3件)

MTUの値ですかね?

    • good
    • 0

経由したルータで分割されることがあります。


多分、受信側で分割したのではないと思うのですが。
    • good
    • 0

いちおう質問に回答すると。



1.特別に制限はないはずですが(かなり自信なし)、UDPですからM単位のデータをやりとりするには向きません。

2.MTUの値が違う可能性はあります。


ちなみにUDPは確か512バイトを1パケットとして送信するはずなので、HPのパソコンでは2パケットで分割されているのでしょう。

なおWinsockですが、使用しているのは Winsockコントロールでしょうか? それともAPIでしょうか?

とりあえずWinsockコントロールという前提でお話しますが、どのような方法でデータの受信を行っていますでしょうか?

lstrlenAを使われているということですから、恐らくこんな形なのではないかと思われます。


'電文を受け取る
winsock.GetData acString, , bytesTotal

これだと状況によってうまくいかないことがあります。

電文はバイト配列で受け取りましょう。

Dim abyteRecData() As Byte '受信データ
Dim alByteNum As Long     '電文長
Dim acRecvMess As String    '電文内容

'電文を受け取る
winsock.GetData abyteData, vbArray + vbByte, bytesTotal

'受信データ長を取得
alByteNum = UBound(abyteRecData)

'電文を変換する(バイト配列をVBの文字型(Unicode)にする)
acRecvMess = StrConv(abyteRecData, vbUnicode)

'バイト配列をクリア
Erase abyteRecData

以上の流れで組み込めば正常に受信出来るのではないかと思われます。


……違ったらごめんなさい。
    • good
    • 0
この回答へのお礼

MTU値を最大にしても、プログラムをいじってもダメでした。
HPサポートセンターに問い合せても、これ以上(レジストリ操作)の質問は受け付けられないと蹴られてしまいました。
プログラムを1024バイトづつ2回に分けて取得するようにしました。
みなさんありがとうございました。

お礼日時:2004/10/30 11:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!