2013-02-18 54 views
1

我試圖在服務器收到「調試」時將數據發送回客戶端。 ATM下文提供了這樣的錯誤:由於套接字未連接,發送或接收數據的請求被禁止 - 發送數據時

發送或接收數據的請求被不允許的,因爲在插座沒有被連接和供給,地址(使用sendto調用發送數據報套接字時)。

增加我的主類,以幫助答題

static Socket newSocket; 
    static byte[] data; 
    static EndPoint tmpRemote; 
    static IPEndPoint sender, endpoint; 
    static int recv; 
    static void Main(string[] args) 
    { 
     data = new byte[1024]; 

     endpoint = new IPEndPoint(IPAddress.Any, 3000); 

     newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

     newSocket.Bind(endpoint); 



     sender = new IPEndPoint(IPAddress.Any, 904); 
     tmpRemote = (EndPoint)sender; 

     newSocket.BeginReceiveFrom(data, 0, data.Length, SocketFlags.None, ref tmpRemote, new AsyncCallback(OperatorCallBack), data); 

     Console.Read(); 
    } 



    private static void OperatorCallBack(IAsyncResult ar) 
    { 
     log("[" + DateTime.Now + "][New Connection] " + tmpRemote.ToString() + ""); 
     try 
     { 
      int size = newSocket.EndReceiveFrom(ar, ref tmpRemote); 
      if (size > 0) 
      { 
       data = (byte[])ar.AsyncState; 
       string[] dataCommand = Encoding.ASCII.GetString(data, 0, size).Split(' '); 
       if (dataCommand[0] == "debug") 
       { 
        newSocket.Send(Encoding.ASCII.GetBytes("HA IT WORKED :)")); 
        log("Sent debug"); 
       } 
       else 
       { 
        log("Invalid Command"); 
       } 
      } 
      data = new byte[1024]; 
      newSocket.BeginReceiveFrom(data, 0, data.Length, SocketFlags.None, ref tmpRemote, new AsyncCallback(OperatorCallBack), data); 
     } 
     catch (Exception exp) 
     { 
      Console.WriteLine(exp.Message); 
     } 
    } 
+0

你不需要先打開一個套接字嗎? – 2013-02-18 18:53:47

+0

@BlessedGeek如果這是問題的錯誤信息會有所不同。 – EJP 2013-02-18 22:55:53

+0

@BlessedGeek我已將主要方法添加到代碼中以幫助回答任何問題。我相信這個插座是開放的。 – 2013-02-18 23:25:43

回答

1

錯誤消息是很清楚。您正在未連接的套接字上調用send(),並且未提供目標地址。你在哪裏發送? UDP不知道。

+0

我已將主要方法添加到代碼中以幫助回答任何問題。我相信這個插座是開放的。 – 2013-02-18 23:27:08

+0

@AndrewZak當然,套接字是*打開的,*但它沒有*連接*,並且你沒有通過調用'sendmsg()'提供一個目標地址。你必須做這些事情之一,通常是後者。 – EJP 2013-02-19 22:46:28

3

我試圖通過慢速連接連接到套接字時遇到了類似的問題。我通過在任何發送/接收調用之前確保newSocket.Connected屬性爲真來解決它。

+1

你可以通過連接它來完成,而不僅僅是通過操縱屬性... – EJP 2014-08-08 23:21:53

2

作爲連接(socket.connect()),當您通過ProtocolType.Udp ,當你不建議wher UDP報文轉發應該

你的情況地址可能出現的錯誤發送的數據不需要 here the address is not provided for udp Send()

SOLUTION

嘗試的SendTo(),而不是

Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
soc.EnableBroadcast = true; 
IPEndPoint ipend = new IPEndPoint(IPAddress.Broadcast, 58717); 
EndPoint endp = (EndPoint)ipend; 
byte[] bytes = new byte[1024]; 

bytes = Encoding.ASCII.GetBytes(str); 

soc.SendTo(bytes,ipend); 

soc.Close(); 
相關問題