国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - python使用epoll實現服務端的方法

python使用epoll實現服務端的方法

2021-04-08 00:29linux_c_coding_man Python

今天小編就為大家分享一篇python使用epoll實現服務端的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import socket
import select
 
send_data = "hello world!"
send_len = len(send_data)
recv_len = 1024
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
addr = ("0.0.0.0", 8765)
tcp_socket.bind(addr)
tcp_socket.listen(5)
tcp_socket.setblocking(False)
epoll = select.epoll()
'''(邊緣觸發)select.EPOLLIN | select.EPOLLET'''
epoll.register(tcp_socket.fileno(), select.EPOLLIN)
'''因為epoll返回的觸發事件對應的是套接字文件描述符,所以需要在字典中加入對應關系'''
fd_to_socket = {tcp_socket.fileno():tcp_socket}
 
while True :
 events = epoll.poll(-1)
 for fd, event in events:
  fd_socket = fd_to_socket[fd]
  if fd == tcp_socket.fileno():
   while True:
    try:
     new_socket, new_addr = fd_socket.accept()
    except socket.error as e:
     (errno, err_msg) = e
     print errno
     print err_msg
     if errno == 11:
      break
    print "new accpet:", new_addr
    new_socket.setblocking(False)
    new_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
    epoll.register(new_socket.fileno(), select.EPOLLIN)
    fd_to_socket[new_socket.fileno()] = new_socket
  elif event&select.EPOLLIN:
   recv_datas = []
   recd = 0
   while (recd < recv_len):
    try:
     recv_data = fd_socket.recv(recv_len - recd)
     '''處理讀的正常關閉'''
     if recv_data == "":
      print "close socket"
      epoll.unregister(fd)
      fd_to_socket[fd].close()
      del fd_to_socket[fd]
      break
     else:
      recv_datas.append(recv_data)
      recd = recd + len(recv_data)
    '''處理異常關閉(EAGAIN,EINTR)'''
    except socket.error as e:
     (errno, err_msg) = e
     print errno
     print err_msg
     '''因為用的水平觸發,EAGAIN我們跳出循環,等待下次觸發再讀就好了'''
     if errno == 11:
      break
     '''軟中斷打斷了還要繼續讀'''
     elif errno == 4:
      continue
     '''其它錯誤我們直接關閉套接字'''
     else:
      print "close socket"
      epoll.unregister(fd)
      fd_to_socket[fd].close()
      del fd_to_socket[fd]
      break
    print repr(recv_datas)
    total_send = 0
    while total_send < send_len:
     sent = fd_socket.send(send_data[total_send:])
     if sent == 0:
      print "close socket"
      epoll.unregister(fd)
      fd_to_socket[fd].close()
      del fd_to_socket[fd]
      break
     else:
      print repr(send_data[total_send:])
      total_send = total_send + sent

其實這里的異常處理我們也可以用

?
1
2
3
except IOError as e:
  print e.errno
  print e.strerror

以上這篇python使用epoll實現服務端的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/peng314899581/article/details/78066087

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人精品一区二区三区视频播放 | 黄片毛片毛片毛片 | 91精品国产人妻国产毛片在线 | 91久久国产 | 99精品免费视频 | 成人久久久久久 | 日韩国产免费观看 | 99精品国产高清一区二区麻豆 | 久久艹色 | 91亚洲国产成人久久精品网站 | 黄色电影天堂 | 国产一级成人 | 黄色一级毛片在线观看 | 日韩成人免费电影 | 成人国产精品视频 | 日韩欧美精品在线 | 日韩精品免费在线视频 | 夜夜夜久久久 | 午夜成人免费影院 | 亚洲精品一区二区网址 | 日韩6699人妻熟女毛片 | 在线日韩视频 | 久久国产精品久久 | 乱视频在线观看 | 精品成人18 | 亚洲综合在线一区 | 精品乱码一区二区三四区 | 一区二区av | 午夜色播 | 日韩在线资源 | 三区免费视频 | 天天操天天插 | 日韩精品一二三区 | 欧美日韩精品一区二区在线播放 | 国产99在线 | 亚洲 | 亚洲aⅴ天堂av在线电影软件 | 久久丁香 | 亚洲精品久久久一区二区三区 | 色婷婷一区二区三区 | 日韩二区三区 | 免费h |