2011-10-18 18 views
1

私はUDPを使って、基本的なファイル転送プロトコルを実装しようとしています。 Beej's Guideを参考にしていますが、私が投稿するコードの多くはそこからです。双方向UDPクライアントとサーバー?

これまでの私のプログラムでは、「話し手」が自分が望むファイルの名前を「受信者」に送信しています。

そこから、受信者はファイルが存在するかどうかをチェックし、存在する場合はファイルのサイズを調べます。

ここで私は問題を抱えています。私は話し手にファイルのサイズを送るために受信機が必要です。あなたは私のコードで(私はそれを実装した方法の下のリンク)を見ることができます。しかし、話し手はまだ何かが送信されるのを待っているようにハングアップします。

これは私がレシーバは、それが戻って話者に通信できるようにするためにいくつかの追加のコードを必要だと思いますし、それからのデータを受け取るません(私はTCPを使用し、その知識の私の不足を言い訳しています)。

誰かが私が紛失しているコードを教えてもらえますか、あるいは間違った機能を使用していますか? Beejのガイドに従うことは難しく、双方向のコミュニケーションの例は提供していません。

ありがとうございました。さらに詳しい情報が必要な場合はお知らせください。


リスナー:http://pastebin.com/UL1xjDnP

トーカ:http://pastebin.com/B2zrXPgZ


EDIT:解決! cnicutarする おかげで、

私はクライアント

if ((numbytes = sendto(sockfd,buffer,strlen(buffer), 0, (struct sockaddr *)&their_addr, &addr_len)) == -1)

+0

が報告「リスナー」となっていますか? – cnicutar

+0

私はなぜUDPであるのだろうか? TCPは、ファイルを転送するためのはるかに優れたプロトコルです。 UDPは、ファイルを転送する際に重要な、逐次配信、破損データの再送信などの機能を提供しません。 –

+0

はい、リスナーはファイルサイズが送信されたことを報告しています。 また、私はUDPを学びたいと思っています。私は両方を知っている価値があると思います。 – user974703

答えて

1

あなたは正しいピアには送信していません。 pgetaddrinfoから取得して送信しています。それであなたは自分にメッセージを送ります。

for(p = servinfo; p != NULL; p = p->ai_next) 
/* .... */ 


numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0, 
    (struct sockaddr *)&their_addr, &addr_len)) == -1) 

/* .... */ 
if ((numbytes = sendto(sockfd,buffer,strlen(buffer), 0, 
    p->ai_addr, p->ai_addrlen)) == -1) 

あなたは可能性が高いと「彼ら」それを送りたい:「:ファイルサイズ送られたリスナーが」

if ((numbytes = sendto(sockfd,buffer,strlen(buffer), 0, 
    (struct sockaddr *)&their_addr, &addr_len)) == -1) 
+0

ビンゴ!それが問題でした。今注目しているのは、話し手が(ファイルサイズの)最後に出力した手紙がゴミだけだということです。私が送っていた文字列の最後に\ nがないので、それはだと仮定していますか? – user974703

+0

@ user974703おそらく '\ 0'をどこかに設定したいでしょう。 – cnicutar

0

最も簡単な解決方法に変更する必要があります

if ((numbytes = sendto(sockfd,buffer,strlen(buffer), 0, p->ai_addr, p->ai_addrlen)) == -1)に対処している必要があるとき、私は、このコードでは、サーバーのアドレス指定されましたあなたの "送信者"が同じポート上で聞くようにすることです/それはサーバーにパケットを送信するために使用しています。サーバは、パケットヘッダーからソースIP /ポートを抽出し、その応答をそこに送信することができます。返信に異なるポート/ ipsを使用する必要がある場合は、送信者は送信する情報にその情報を含める必要があります。例えば"ここにあなたの情報があり、x.x.x.xへの返信を送信します:yyy"

+0

聞く必要はありません。 'recvfrom'(すでにやっている)で十分です。 – cnicutar

関連する問題