我正在尝试使用套接字将字符串打印到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();
}
答案 0 :(得分: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();
}
}
....
答案 1 :(得分:0)
您不应该使用列表器套接字来传输数据,您应该使用客户端套接字来发送或接收数据,Usully侦听器套接字仅用于接收。使用客户端套接字然后您的问题将得到解决。
在这里,您要创建一个Listner套接字而不是客户端套接字
sock = new Socket(ep.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
sock.Bind(ep);
sock.Listen(10);
正确的方法是创建一个新的socket实例并将其连接到Endpoints
如果我是你,我不会使用Socket类,而是使用framwork提供的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);