TCP响应未被发送的可能原因?

时间:2016-07-24 08:05:45

标签: python sockets tcp twisted

即使连接处于活动状态,也不会发送TCP响应的原因。 (即我们能够通过相同的连接同时接收TCP流)

使用Twisted(Python)

设置TCP连接

总结您的系统。

  • 我们的应用程序(比方说B)通过TCP连接到应用程序A.

  • B也通过IPC(I。)在0MQ上连接到C(单独的服务) 相信它是一个Unix套接字)

  • C通过TCP连接到PostgresSQL(通过SSL)

正常消息流看起来像这样

A --TCP--> B -- IPC(0MQ) --> C (C query DML over TCP to Postgres)
                               |
                               |
A <--TCP-- B <-- IPC(0MQ) <-- C (DML Result)

现在,有一段时间(随机发生)对TCP服务器的响应(即从B到A)没有被发送。

我们使用以下ngrep确认了上述内容(其中x.x.x.x是IP或TCP服务器)

ngrep -d eno1 -pqtW byline net x.x.x.x

但是我们的日志有条目表示发送的响应(来自B)(在我们通过TCP 写入响应之后写入)到A。

def send_tcp_response_to_sms800(self,response):
    self.log.info("Sending TCP response for message id {message_id}",message_id=response[0])
    message = self.create_message(response)
    ber_enc_message = ber_encoder.encode(message)
    self.transport.write(b'\x7e\x7e\x7e\x7e')
    self.transport.write(struct.pack('>I', len(ber_enc_message)))
    self.transport.write(ber_enc_message)  ## <-- response written to TCP
    self.log.info("response sent to sms800 from {qs}",qs=self.queue_server_name)
    timestamp = strftime("%a, %d %b %Y %H:%M:%S")
    self.log_message_id_in_response(response[0],timestamp) ## <-- ## log file where message id from the response is logged

为了安全,这与内存无关

ulimit -a

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 30933
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 4096
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

我已经不知道这可能是什么原因。

注意:我们已经彻底检查,B到C之间的通信在这里不是问题。我们交叉检查B和C应用程序的日志,并在B和C之间找到一对匹配的请求/响应。

0 个答案:

没有答案