0

我正在尝试使用套接字将字符串打印到 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();
}
4

2 回答 2

1

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

 ....
     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();
        }
    }


    ....
于 2014-03-26T13:28:34.020 回答
0

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

在这里,您正在创建一个 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);
于 2013-11-12T07:03:26.387 回答