Я разрабатывал приложение, которое автоматически печатает файлы PDF на определенных сетевых принтерах по прибытии и отслеживает сообщения @PJL USTATUS JOB
.Однако всякий раз, когда я запускаю свое приложение и код набирает socket.BeginReceive()
, принтер не может получать задания печати с любой рабочей станции, что также означает, что обратный вызов никогда не будет вызываться.Однако если я закрою свое приложение или просто сокет, принтер снова начнет работать.
Я что-то пропустил?Например, блокирующие / неблокирующие, синхронные или асинхронные сокеты?
public class SocketData {
public Socket socket;
public byte[] dataBuffer = new byte[1024];
}
public void Start() {
// start the thread that checks the printer status
thread = new Thread(new ThreadStart(ConnectAndListen));
thread.Priority = ThreadPriority.Lowest;
thread.Start();
// start the file listener
listener = new FileSystemWatcher(this.WatchPath);
listener.Created += new FileSystemEventHandler(listener_Created);
listener.EnableRaisingEvents = true;
}
public void ConnectAndListen() {
ipEndPoint = new IPEndPoint(Dns.GetHostEntry(this.IPAddress).AddressList[0], 9100);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(ipEndPoint);
//socket.Send(Encoding.ASCII.GetBytes("\x1B%-12345X@PJL USTATUS DEVICE = ON\r\n\x1B%-12345X\r\n"));
//socket.Send(Encoding.ASCII.GetBytes("\x1B%-12345X@PJL USTATUS JOB = ON\r\n\x1B%-12345X\r\n"));
socket.Send(Encoding.ASCII.GetBytes("\x1B%-12345X@PJL USTATUS PAGE = ON\r\n\x1B%-12345X\r\n"));
//socket.Send(Encoding.ASCII.GetBytes("\x1B%-12345X@PJL USTATUS TIMED = 0\r\n\x1B%-12345X\r\n"));
ListenForPrinterReadBack(socket);
}
public void ListenForPrinterReadBack(Socket socket) {
if (DataRecievedCallBack == null) {
DataRecievedCallBack = new AsyncCallback(OnDataReceived);
}
SocketData socketData = new SocketData();
socketData.socket = socket;
m_asynResult = socket.BeginReceive(socketData.dataBuffer, 0, socketData.dataBuffer.Length, SocketFlags.None, DataRecievedCallBack, socketData);
}
public void OnDataReceived(IAsyncResult asyn) {
SocketData socketData = (SocketData)asyn.AsyncState;
int result = socketData.socket.EndReceive(asyn);
char[] chars = new char[result + 1];
Decoder d = Encoding.UTF8.GetDecoder(); //creating object for decoding
int charLen = d.GetChars(socketData.dataBuffer, 0, result, chars, 0);
String recievedData = new String(chars);
this.Status = recievedData;
ListenForPrinterReadBack(socketData.socket);
}
Я знаю, что могу сделать опрос, но не смогу получать нежелательные сообщения от принтера.
Заранее спасибо!
ОБНОВЛЕНИЕ: У меня такое ощущение, что на принтерах разрешено только одно гнездо.Поскольку socket.BeginReceive()
может работать только при подключенном сокете, любые другие запросы не могут быть отправлены, так как сокет уже используется.Может быть, есть другой способ обработки нежелательных отзывов на принтер?