2013-02-18 55 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(); 
相关问题