2013-12-22 7 views
6

GoにUDPサーバーとクライアントを作成しました。サーバがport 1200で動作しているときにエラーメッセージが表示されない場合、クライアントが同じマシン(OS X 10.9.1)のポート1200に接続しようとしているときにエラーが表示されません。GoでUDPサーバー/クライアントがデータを読み取らない

サーバは"SOS ..."を印刷します。これは、クライアントが書き込んでいるメッセージです。無限ループです。

クライアントはサーバーにメッセージを送信できますが、サーバーが読み取っている内容は0バイトです。

サーバコード

package main 

import ("net" "fmt" "time") 

func main() { 

     port := "127.0.0.1:1200" 

     udpAddress, err := net.ResolveUDPAddr("udp4",port) 

     if err != nil { 
       fmt.Println("error resolving UDP address on ", port) 
       fmt.Println(err) 
       return 
     } 

     conn ,err := net.ListenUDP("udp",udpAddress) 

     if err != nil { 
       fmt.Println("error listening on UDP port ", port) 
       fmt.Println(err) 
       return 
     } 

     defer conn.Close() 

     var buf []byte 

     for { 

       time.Sleep(100 * time.Millisecond) 

       n,address, err := conn.ReadFromUDP(buf) 

       if err != nil { 
         fmt.Println("error reading data from connection") 
         fmt.Println(err) 
         return 
       } 

       if address != nil { 

         fmt.Println("got message from ", address, " with n = ", n) 

         if n > 0 { 
           fmt.Println("from address", address, "got message:", string(buf[0:n]), n) 
         } 
       } 
     } 

} 

クライアントコード、コマンドgo run udp-client.go :1200またはgo run udp-client.go 127.0.0.1:1200で、同じサーバー上で実行されている

package main 

import (
"fmt" 
"net" 
"os" 
"time" 
) 

func main() { 

     if len(os.Args) != 2{ 
       fmt.Fprintf(os.Stderr, "Usage:%s host:port", os.Args[0]) 
       os.Exit(1) 
     } 

     service := os.Args[1] 

     fmt.Println("Connecting to server at ", service) 

     conn, err := net.Dial("udp",service) 

     if err != nil { 
       fmt.Println("Could not resolve udp address or connect to it on " , service) 
       fmt.Println(err) 
       return 
     } 

     fmt.Println("Connected to server at ", service) 

     defer conn.Close() 

     fmt.Println("About to write to connection") 

     for { 

       time.Sleep(1000*time.Millisecond) 
       n, err := conn.Write([]byte("SOS ... \n")) 
       if err != nil { 
         fmt.Println("error writing data to server", service) 
         fmt.Println(err) 
         return 
       } 

       if n > 0 { 
         fmt.Println("Wrote ",n, " bytes to server at ", service) 
       } 
     } 

} 
+1

今すぐにテストや徹底的に見ている時間はありませんが、conn.Write()でエラーをチェックしていません。 –

+0

あなたの権利は、writeUDPからクライアントにメッセージを送信できるように、クライアントのアドレスを持つサーバー。その前に、クライアントはサーバーにメッセージを送信する必要があります。私はコードを書き換え、少なくともサーバーとクライアントは通信していますが、まだデータは読み込まれていません。データが正しく書き込まれていることを確認することができます。 – ppone

+0

質問のコードを更新しました。 – ppone

答えて

7

UDPConn.ReadFromUDP方法は、データを読み取り、指定したスライスに格納します。 このスライスはゼロです。したがって、バッファーはデータのための十分なスペースを提供しません。あなたは、サーバーコードで1行を変更することでこの問題を解決することができ :

var buf []byte = make([]byte, 1500) 

バッファサイズは、おそらくあなたのネットワークプロトコルに合わせて選択する必要があります。または、最大サイズのudpパケットを受信できるように64kバッファを作成します。これはちょっとお粗末です:)

関連する問題