【问题标题】:A request to send or receive data was disallowed the socket is not connected不允许发送或接收数据的请求 套接字未连接
【发布时间】:2013-11-24 05:29:23
【问题描述】:

我正在尝试使用套接字将字符串打印到 RFID 打印机。这是我的代码。当我打电话时:

Print p = new Print();
p.printToIP();

我收到此错误:不允许发送或接收数据的请求,因为未连接套接字并且(在使用 sendto 调用在数据报套接字上发送时)未提供地址。

这是我的课程代码:

class Print
{

    public string printerIP { get; set; }
    public int printerPort { get; set; }
    public string myZPL { get; set; }
    private EndPoint ep { get; set; }
    private Socket sock { get; set; }
    private NetworkStream ns { get; set; }
    //private AsyncCallback callbackWrite;

public Print()
{
    printerIP = "127.0.0.1";
    printerPort = 9001;
    myZPL = "AN12345";
}



public void printToIP()
{
    ep = new IPEndPoint(IPAddress.Parse(printerIP), printerPort);
    sock = new Socket(ep.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
    sock.Bind(ep);
    sock.Listen(10);

    try
    {
        sock.Connect(ep);
        ns = new NetworkStream(sock);
        byte[] toSend = Encoding.ASCII.GetBytes(myZPL);
        ns.BeginWrite(toSend, 0, toSend.Length, OnWriteComplete, null);
        ns.Flush(); 
    }
    catch (Exception ex)
    {
        sock.Shutdown(SocketShutdown.Both);
        sock.Close();
    }

}

private void OnWriteComplete(IAsyncResult ar)
{
    NetworkStream thisNS = ns;
    thisNS.EndWrite(ar);
    sock.Shutdown(SocketShutdown.Both);
    sock.Close();
}

【问题讨论】:

    标签: c# sockets printing rfid


    【解决方案1】:

    您不应该使用侦听器套接字来传输数据,您应该使用客户端套接字来发送或接收数据,通常侦听器套接字仅用于接收。使用客户端套接字然后您的问题将得到解决。

    这里您创建的是 Listner 套接字而不是客户端套接字

      sock = new Socket(ep.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
      sock.Bind(ep);
      sock.Listen(10);
    

    正确的方法是创建一个新的套接字实例并将其连接到端点

    如果我是你,我不会使用 Socket 类,而是使用框架提供的 TCPClinet/TCPListner 类。

    对于像这样的 Tcpclinet 类

    System.Net.Sockets.TcpClient clinet = new System.Net.Sockets.TcpClient();
                clinet.Connect(endpoint_object); 
    

    对于普通的 Socket 类就是这样,所以你必须在你的情况下使用下面的代码

     Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
        clientSock.Connect(ipEnd);
    

    【讨论】:

    • ..抱歉,请提供示例。
    • 谢谢你....我使用它并得到一个不同的错误。无法建立连接,因为目标机器主动拒绝它 127.0.0.1:9100。我假设端口号是错误的。打印机正在使用 USB001 端口。但是在创建套接字时如何使用它作为我的端口号。
    • 你的意思是USB001?
    • 您收到该错误是因为在指定的 ipendpoint 上没有侦听传入客户端的套接字。你能告诉我你想做什么吗?
    • @DoobyInc.....USB001 是打印机在该打印机属性的端口选项卡中分配给的虚拟 USB 端口。我正在尝试将字符串打印到 RFID 打印机(Printronix SL4M RFID 热转印打印机)
    【解决方案2】:

    您收到此错误是因为您在客户端连接之前发送了数据。

     ....
         var res = sock .BeginAccept(AcceptCallback, null);
    
        }
    
        private void AcceptCallback(IAsyncResult result)
        {           
            Socket socket = sock .EndAccept(result);           
    
            while (true)
            {
                sock.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, 
                                  new AsyncCallback(ReceiveCallBack), socket);
                _resetEvent.WaitOne();
                _resetEvent.Reset();
            }
        }
    
    
        ....
    

    【讨论】:

      猜你喜欢
      • 2013-07-31
      • 2014-12-20
      • 2018-06-20
      • 2014-08-30
      • 2013-02-03
      • 2021-08-16
      • 1970-01-01
      • 2018-07-01
      • 2021-10-11
      相关资源
      最近更新 更多