- PR -

WinsockによるUDPプログラミング(送信受信プログラム)

1
投稿者投稿内容
ばーど
常連さん
会議室デビュー日: 2005/08/03
投稿数: 32
投稿日時: 2006-09-30 17:34
こんばんわ。

A→B→C端末と言う風に、
A端末:B端末へ1024Byteずつ送信。
B端末:A端末からのパケットを受信し、C端末へ向けて送信。
C端末:B端末からのパケットを受信。

と、Winsockを用いてC言語でプログラミングを行なっています。

以下にB端末の送信・受信プログラムを示します。
以下のプログラムは、A端末からの1024Byteずつ送信されてくる、パケットをwhileループ内のrecvfrom関数で受信(recv_Buf[1025]内に格納)し、memcpyにて受信した1024Byte分のデータをrecv_Buff[1025]にコピーを行い、UDPSend関数内のsendtoにて、C端末へ向けて送信しています。

while (1) {
SOCKADDR_IN from;
int fromlen;
int size;
char recv_Buf[1025],recv_Buff[1025];

fromlen = (int)sizeof(from);
//(1)
size = recvfrom(s2, recv_Buf, (int)sizeof(recv_Buf) - 1, 0, (SOCKADDR *)&from, &fromlen);

if (size == SOCKET_ERROR) {
//(2)
perror("recvエラーです\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n");
closesocket(s2);
WSACleanup();
return -3;
}

//recv_Buff内を初期化
memset(recv_Buff,0,sizeof(recv_Buff));

//recv_Bufをrecv_Buffにコピー
memcpy(recv_Buff,recv_Buf,size);

UDPSend(portNo,szServer,recv_Buff);
}

int UDPSend(unsigned short portNo,char *szServer,char *recv_Buff)
{

sendto(s1, recv_Buff, (int)strlen(recv_Buff), 0, (LPSOCKADDR)&addrin1, sizeof(addrin1));

}

[質問内容]
C端末においてパケットを受信する際、receiveエラーが発生してしまいます。
おそらく、B端末における送信・受信プログラムがうまく動作していないと考えています。
C端末も受信を行なうので上記プログラムとほぼ同じです。コメント(2)で示した「recvエラーです」が表示され、
パケットを受信することができません。

そこで、デバックを行なったところ、B端末においてコメント(1)のsizeの返り値は1024ですが、C端末では4が返り値でした。
(recvfrom関数は、成功したら受信したバイト数が返され、失敗したときは、SOCKET_ERRORが返されます。)

上記の記述内容で、受信した1024Byteを送信できているのでしょうか?

よろしくお願いします。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-09-30 21:48
[quote]
ばーどさんの書き込み (2006-09-30 17:34) より:
コード:
sendto(s1, recv_Buff, (int)strlen(recv_Buff), 0, (LPSOCKADDR)&addrin1, sizeof(addrin1));


本当に1024byte送信しているんですね?
まさかstrlen(recv_Buff)が4を返しているなんて落ちは無いよね。

引用:

C端末においてパケットを受信する際、receiveエラーが発生してしまいます。


せめてエラーコードくらいは確認する。

引用:

おそらく、B端末における送信・受信プログラムがうまく動作していないと考えています。


パケットモニターを併用する事を強く推奨。そうすれば憶測の入る余地は無い。
受信が旨く動いているのかは受信したデータを見れば一目瞭然だし、送信に問題が無いかはパケットモニターで見れば一目瞭然。
1

スキルアップ/キャリアアップ(JOB@IT)