socket.BeginReceive () выводит принтер из строя - PullRequest
0 голосов
/ 11 мая 2011

Я разрабатывал приложение, которое автоматически печатает файлы 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() может работать только при подключенном сокете, любые другие запросы не могут быть отправлены, так как сокет уже используется.Может быть, есть другой способ обработки нежелательных отзывов на принтер?

Ответы [ 2 ]

0 голосов
/ 22 декабря 2014

Привет, я обнаружил ту же проблему, что и у тебя при использовании принтера

Во-первых: убедитесь, что принтер находится в режиме «Двунаправленный» и попробуйте этот код:

  private void SendCommand(byte[] data, string ip, int port)
    {
        var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        socket.NoDelay = true;

        var ipAddress = IPAddress.Parse(ip);
        IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);

        socket.Connect(remoteEP);
        socket.Send(data);
        socket.Close();
    }

и будет хорошо работать.

С наилучшими пожеланиями

0 голосов
/ 11 мая 2011

Сообщает ли Send, что все байты были отправлены (проверьте, что это возвращаемое значение)?Я не могу обнаружить никаких ошибок, которые мешали бы другому концу получить ваше сообщениеВы на 100% уверены, что отправленная строка верна?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...