python 은 epoll 을 사용 하여 서버 를 실현 하 는 방법
#!/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
사실 여기 이상 처리 저희 도 쓸 수 있어 요.
except IOError as e:
print e.errno
print e.strerror
이상 의 python 에서 epoll 을 사용 하여 서버 를 실현 하 는 방법 은 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 께 참고 할 수 있 고 많은 응원 을 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.