0

我们正在做一个 ZMQ PUB/SUB 方法。PUB/SUB 交换是用 dot net (.Net) 编写的,.Net 交换的发布者是用 Python 编写的。当 Python PUB 与 .Net 交换时,它经常崩溃,并出现以下错误:

mono phoenix.exe XChange                                                                    

[73/73]Phoenix v.1.1.16.32 {DEBUG}
Command:XCHANGE 
Starting XChange: PhoenixExchange[XSubAddr:tcp://*:5201[In] XPubAddr:tcp://*:5202[In]]

Unhandled Exception:
System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: count
  at System.Net.Sockets.SocketAsyncEventArgs.SetBufferInternal (System.Byte[] buffer, Int32 offset, Int32 count) <0x7423bc20 + 0x000e4> in <filename unkn
own>:0 
  at System.Net.Sockets.SocketAsyncEventArgs.SetBuffer (Int32 offset, Int32 count) <0x7423d278 + 0x00027> in <filename unknown>:0 
  at AsyncIO.DotNet.NativeSocket.Receive (System.Byte[] buffer, Int32 offset, Int32 count, SocketFlags flags) <0x7423c8b0 + 0x000f3> in <filename unknown
>:0 
  at NetMQ.Core.Transports.StreamEngine.BeginRead (NetMQ.Core.Transports.ByteArraySegment data, Int32 size) <0x7423c7d0 + 0x00057> in <filename unknown>:
0 
  at NetMQ.Core.Transports.StreamEngine.HandleHandshake (Action action, SocketError socketError, Int32 bytesTransferred) <0x742399b0 + 0x007df> in <filen
ame unknown>:0 
  at NetMQ.Core.Transports.StreamEngine.Handle (Action action, SocketError socketError, Int32 bytesTransferred) <0x74238b78 + 0x0019b> in <filename unkno
wn>:0 
  at NetMQ.Core.Transports.StreamEngine.FeedAction (Action action, SocketError socketError, Int32 bytesTransferred) <0x742387c8 + 0x0002b> in <filename u
nknown>:0 
  at NetMQ.Core.Transports.StreamEngine.InCompleted (SocketError socketError, Int32 bytesTransferred) <0x7423d188 + 0x00027> in <filename unknown>:0 
  at NetMQ.Core.IOObject.InCompleted (SocketError socketError, Int32 bytesTransferred) <0x74236408 + 0x0003b> in <filename unknown>:0 
  at NetMQ.Core.Utils.Proactor.Loop () <0x74218f88 + 0x00343> in <filename unknown>:0 
  at System.Threading.ThreadHelper.ThreadStart_Context (System.Object state) <0x748a8100 + 0x000c7> in <filename unknown>:0 
  at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System
.Object state, Boolean preserveSyncCtx) <0x748a67bc + 0x001af> in <filename unknown>:0 
  at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object 
state, Boolean preserveSyncCtx) <0x748a6788 + 0x0002b> in <filename unknown>:0 
  at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object 
state) <0x748a66e4 + 0x0005b> in <filename unknown>:0 
  at System.Threading.ThreadHelper.ThreadStart () <0x748a82d0 + 0x00037> in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: count
  at System.Net.Sockets.SocketAsyncEventArgs.SetBufferInternal (System.Byte[] buffer, Int32 offset, Int32 count) <0x7423bc20 + 0x000e4> in <filename unkn
own>:0 
  at System.Net.Sockets.SocketAsyncEventArgs.SetBuffer (Int32 offset, Int32 count) <0x7423d278 + 0x00027> in <filename unknown>:0 
  at AsyncIO.DotNet.NativeSocket.Receive (System.Byte[] buffer, Int32 offset, Int32 count, SocketFlags flags) <0x7423c8b0 + 0x000f3> in <filename unknown
>:0 
  at NetMQ.Core.Transports.StreamEngine.BeginRead (NetMQ.Core.Transports.ByteArraySegment data, Int32 size) <0x7423c7d0 + 0x00057> in <filename unknown>:
0 
  at NetMQ.Core.Transports.StreamEngine.HandleHandshake (Action action, SocketError socketError, Int32 bytesTransferred) <0x742399b0 + 0x007df> in <filen
ame unknown>:0 
  at NetMQ.Core.Transports.StreamEngine.Handle (Action action, SocketError socketError, Int32 bytesTransferred) <0x74238b78 + 0x0019b> in <filename unkno
wn>:0 
  at NetMQ.Core.Transports.StreamEngine.FeedAction (Action action, SocketError socketError, Int32 bytesTransferred) <0x742387c8 + 0x0002b> in <filename u
nknown>:0 
  at NetMQ.Core.Transports.StreamEngine.InCompleted (SocketError socketError, Int32 bytesTransferred) <0x7423d188 + 0x00027> in <filename unknown>:0 

python代码是一个简单的pub。

import sys, os
is_py2 = sys.version[0] == '2'

import time, datetime
import zmq 
from xml.etree import ElementTree as xmltree


def publishpageforoledtoxchange():
    """
    publishpageforoledtoxchange - this is to test the OLEDS.PY
    It will send a couple pages to the oled.
    :return:
    """
    try:
        pub = "tcp://%s:%s" % ("172.16.0.10", "5201")
        context = zmq.Context()
        sock_outbound = context.socket(zmq.PUB)  # PUSH
        sock_outbound.linger = 0
        try:
            sock_outbound.bind(pub)
            print("Outbound publisher bind succesfull = %s" % (pub,))
            time.sleep(1)
        except:
            sock_outbound = context.socket(zmq.PUB)
            sock_outbound.connect(pub)
            print("Outbound publisher connect succesfull = %s" % (pub,))
            time.sleep(1)


        #     Topic: OLED.Display. < option > page name / guid
        #     < xmOLEDPage Page = "TestPage" TTL = "60" TStamp = "iso format" >
        #     < RenderText Size = "1" X = "1" Y = "1" Text = "Hello World" / >
        # < / xmOLEDPage >
        systree = xmltree.Element("xmOLEDPage")
        systree.attrib['Page'] = '%s' % "Pub1"
        systree.attrib['TTL'] = "900"
        systree.attrib['TStamp'] = "%s" %datetime.datetime.now()
        renderelm = xmltree.SubElement(systree, "RenderText")
        renderelm.attrib['X'] = "0"
        renderelm.attrib['Y'] = "0"
        renderelm.attrib['Text'] = "012345678901234567890"
        renderelm2 = xmltree.SubElement(systree, "RenderText")
        renderelm2.attrib['X'] = "0"
        renderelm2.attrib['Y'] = "13"
        renderelm2.attrib['Text'] = "Y13 45678901234567890"
        renderelm3 = xmltree.SubElement(systree, "RenderText")
        renderelm3.attrib['X'] = "0"
        renderelm3.attrib['Y'] = "30"
        renderelm3.attrib['Text'] = "Y30 4  YES  890"

        xmlstr = xmltree.tostring(systree, method='xml')
        print(xmlstr)

        sendmsg1  = ["OLED.Display.Test", xmlstr]
        sock_outbound.send_multipart(sendmsg1)
        time.sleep(2)


        for x in range(0, 99):
            sock_outbound.send_multipart(sendmsg1)
            time.sleep(4)


    except Exception as exct:
        print("Outbound exct = %s" % (exct,))



if __name__ == '__main__':
    try:
        publishpageforoledtoxchange()
    except Exception as mainerr:
        print("Main execption occured: %s" %mainerr)
    os._exit(-1)
4

0 回答 0