Работает ли make-network-process в Windows? - PullRequest
2 голосов
/ 09 июля 2011

У меня проблемы с отладкой программы, которая использует emacs lisp для работы в качестве простого tcp-клиента. Я сократил это до минимума, чтобы представить здесь вопрос. Этот код прекрасно работает на Max OSX и на машине с Linux Centos, но в Windows (все с последней версией Gnu emacs) функции обратного вызова для процесса sentinel и filter не вызываются. Блокирующее соединение работает, в то время как неблокирующее соединение говорит, что не поддерживается в Windows, с чем я могу жить. Сервер показывает, что клиент подключается и отключается нормально; но никакой вывод, кажется, не сделать это на сервер. В конце концов сервер отключается.

Есть идеи?

(defvar *url-process* nil)
(defvar *url-state* nil)
(defvar *url-response* nil)

(defun url-buffer-message(process message)
  "print a message to the url process buffer"
  (save-excursion 
    (set-buffer (process-buffer process))
    (insert message)))

(defun url-sentinel(process event)
  "sentinal function for url network process which monitors for events"
  (url-buffer-message process (format "sentinel event %s" event))
  (cond 
   ((string-match "open" event)
    (setq *url-state* 'open))))

(defun url-filter(process string)
  "filter function for url network process, which receives output"
  (url-buffer-message process (format "filter %s" string)) ; debug
  (setq *url-response* string))

(defun url-new-process(p)
  (url-delete-process)
  (setf *url-process* p))

(defun url-delete-process()
  (when *url-process*
    (delete-process *url-process*)
    (setq *url-state* 'closed)))

(defun url-hai(host port blocking)
  (setq *url-state* 'opening)
  (url-new-process
   (make-network-process :name "url"
             :host host
             :service port
             :nowait (not blocking)
             :filter #'url-filter
             :sentinel #'url-sentinel
             :buffer (get-buffer-create "*url*"))))

(defun url-kthxbye()
  (url-delete-process))

(defun url-ping()
  (if (and *url-process* (eq *url-state* 'open))
      (process-send-string *url-process* "PING\r\n")))

(defun url-get()
  (if (and *url-process* (eq *url-state* 'open))
      (process-send-string *url-process* (format "GET /\r\n"))))

(defun url-info()
  (if (and *url-process* (eq *url-state* 'open))
      (process-send-string *url-process* "INFO\r\n")))

; usage
; (url-hai "127.0.0.1" 80 t)
; (url-hai "127.0.0.1" 80 nil)
; (url-get)
; (url-kthxbye)

1 Ответ

3 голосов
/ 12 июля 2011

Проблема здесь была связана с make-network-process

При вызове этой функции с помощью: nowait установлено в nil, чтобы сделать синхронный вызов / блокировка функции часового никогда не вызывается с состоянием «открыто».К сожалению, я полагался на такое поведение, и в своих функциях, которые отправляют данные, я проверяю, открыто ли еще соединение.

Однажды я обнаружил, что исправление было очевидным;просто установите состояние 'open, если функция make-network-process завершается успешно, и это блокирующий вызов.Рабочий код ниже:

(defun url-delete-process()
  (when *url-process*
    (delete-process *url-process*)
    (setq *url-state* 'closed)))

(defun url-hai(host port blocking)
  (setq *url-state* 'opening)
  (url-delete-process)
  (let ((p 
     (make-network-process :name "url"
                   :host host
                   :service port
                   :nowait (not blocking)
                   :filter #'url-filter
                   :sentinel #'url-sentinel
                   :buffer (get-buffer-create "*url*"))))
    (if p 
    (progn
      (if blocking 
          (setf *url-state* 'open))
      (setf *url-process* p)))))

(defun url-kthxbye()
  (url-delete-process))
...