python的udp服务器多进程编程

这里只演示os.fork派生子进程

"""
   仅仅是演示udp的多进程服务器编程,未使用信号处理函数处理僵死进程
"""

import socket, os
ser = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
ser.bind(('10.10.22.101', 10000))

while True:
      data, addr = ser.recvfrom(1024)
      pid = os.fork()
      if pid:
         continue
      else:
         conn = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
         """
            这是一行核心代码,具体的理论基础请参见《tcp/ip协议族卷一:协议》
            "udp服务器设计这一小节"
         """
         conn.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
         conn.bind(("10.10.22.101", 1000))
         """
            这里直接使用data和addr是有问题的,因为主udp进程返回等待新的udp数据报
            新的返回值data和addr可能会覆盖原有的数据,可以采取其他的解决办法
         """
         conn.connect(addr)
         conn.sendall("OK , you enter: "+data)
         os._exit(0)

客户端向udp server发送数据,udp server会派生一个进程处理(另外程序中udp套接字使用connect函数是有其意义的,具体可参见《unix网络套接字编程API》),截图如下:


这里两个客户端分别发送了一次,产生了两个僵死进程

程序在派生的子进程那里要处理一下,否则同一个客户端没发送一条报文都会派生一个子进程,解决方法是:我们在子进程改用while True:循环进行读写,并且设设置某种结束标志,收到后子进程终止(或者设置超时值)


经过while True:循环读写还是有很多问题,后续解决

你可能感兴趣的:(python学习)