반응형

출처
https://serverfault.com/questions/7689/how-do-i-get-rid-of-sockets-in-fin-wait1-state

FIN_WAIT1 상태를 소켓에서 어떻게 제거하나요?

kill이 필요한 프로세스에 의해 차단된 포트가 있습니다. (충돌한 telnet 대몬). 프로세스가 성공적으로 종료되었지만 포트는 여전히 'FIN_WAIT1' 상태입니다. 그것은 나오지 않으며, 그 시간 초과는 '십년'으로 설정된 것 같습니다.

포트를 해제할 수 있는 유일한 방법은 전체 시스템을 재부팅하는 것인데, 이는 당연히 하고 싶지 않은 일입니다.

$ netstat -tulnap | grep FIN_WAIT1 
tcp        0  13937 10.0.0.153:4000         10.0.2.46:2572 

리부팅 없이 블록되지 않도록 포트를 처리하는 방법에 대해 아시는 분 있나요?


9개의 답변 중 1개의 답변

# tcp_max_orphans의 현재 값을 기록
original_value=$(cat /proc/sys/net/ipv4/tcp_max_orphans)

#tcp_max_orphans를 임시로 0 으로 설정
echo 0 > /proc/sys/net/ipv4/tcp_max_orphans

# /var/log/messages 확인
# 그것은 "kernel: TCP: too many of orphaned sockets"를 뱉어낼 것입니다.
# 접속이 없어지는 데 오래 걸리지 않을 것입니다. 

# 이전에 있던 tcp_max_orphans 의 값을 복구합니다.
echo $original_value > /proc/sys/net/ipv4/tcp_max_orphans

# 다음으로 검증합니다.
netstat -an|grep FIN_WAIT1
반응형
반응형

출처 : https://stackoverflow.com/questions/2719017/how-to-set-timeout-on-pythons-socket-recv-method

파이썬 소켓 수신 메소드에서 timeout을 정하는 방법?

저는 파이썬의 소켓 수신 메소드에서 timeout을 정하고 싶습니다. 어떻게 할 수 있을까요?

11개의 답변 중 1개의 답변만 추려냄

일반적인 접근은 timeout이 발생할 때까지 데이터가 접근 가능할 때까지 select()를 사용하는 것입니다. 데이터가 실제로 가능할 때만 recv()를 호출합니다. 안전을 위해, 우리는 recv가 무한으로 block하지 않는 것을 보장하기 위해 non-blocking 모드로 소켓을 설정할 수 있습니다. select()는 한번에 하나 이상의 소켓을 기다리도록 하는데 사용될 수 있습니다.

import select

mysocket.setblocking(0)

ready = select.select([mysocket], [], [], timeout_in_seconds)
if ready[0]:
    data = mysocket.recv(4096)

만약 많은 열려있는 파일 디스크립터가 있다면, poll()select()보다 더 효율적인 대안입니다.

다른 옵션은 socket.settimeout()을 사용하여 소켓의 모든 연산에 timeout을 설정하는 것입니다. 하지만 당신은 다른 답변에서 해당 솔루션을 명시적으로 거부했던 것을 확인하였습니다.

반응형
반응형

출처 : https://pythontic.com/modules/socket/udp-client-server-example

UDP - 파이썬에서 클라이언트 서버 예제 프로그램

UDP 개요

UDP는 User Datagram Protocol의 약어입니다. UDP는 TCP/IP 슈트의 인터넷 프로토콜을 사용합니다. UDP를 사용한 통신에서 클라이언트 프로그램은 메시지 패킷을 대상 서버로 전송하며 대상 서버도 UDP에서 실행됩니다.

UDP의 속성

  • UDP는 메시지 패킷 전달을 보장하지 않습니다. 네트워크에서 일부 문제가 발생하면 패킷이 손실되면 영원히 손실될 수 있습니다.
  • 확실한 메시지 전달을 보장할 수 없으므로 UDP는 신뢰할 수 없는 프로토콜로 간주됩니다.
  • UDP를 구현하는 기본 메커니즘에는 연결 기반 통신이 필요하지 않습니다. UDP 서버 또는 UDP 클라이언트 간에 데이터 스트리밍이 없습니다.
  • UDP 클라이언트는 "n"개의 별개의 패킷을 UDP 서버로 보낼 수 있으며 UDP 서버의 응답으로 "n"개의 별개의 패킷을 수신할 수도 있습니다.
  • UDP는 비 연결 프로토콜이므로 UDP와 관련된 오버 헤드는 TCP와 같은 연결 기반 프로토콜에 비해 적습니다.

예시: 파이썬을 사용한 UDP 서버

import socket

localIP     = "127.0.0.1"
localPort   = 20001
bufferSize  = 1024

msgFromServer       = "Hello UDP Client"
bytesToSend         = str.encode(msgFromServer)

# 데이터그램 소켓을 생성
UDPServerSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)

# 주소와 IP로 Bind
UDPServerSocket.bind((localIP, localPort))

print("UDP server up and listening")

# 들어오는 데이터그램 Listen
while(True):
    bytesAddressPair = UDPServerSocket.recvfrom(bufferSize)
    message = bytesAddressPair[0]
    address = bytesAddressPair[1]

    clientMsg = "Message from Client:{}".format(message)
    clientIP  = "Client IP Address:{}".format(address)

    print(clientMsg)
    print(clientIP)

    # Sending a reply to client
    UDPServerSocket.sendto(bytesToSend, address)

출력:

UDP server up and listening
Message from Client:b"Hello UDP Server"
Client IP Address:("127.0.0.1", 51696)

예시: 파이썬을 사용한 UDP 클라이언트

import socket

msgFromClient       = "Hello UDP Server"
bytesToSend         = str.encode(msgFromClient)
serverAddressPort   = ("127.0.0.1", 20001)
bufferSize          = 1024

# 클라이언트 쪽에서 UDP 소켓 생성
UDPClientSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)

# 생성된 UDP 소켓을 사용하여 서버로 전송
UDPClientSocket.sendto(bytesToSend, serverAddressPort)

msgFromServer = UDPClientSocket.recvfrom(bufferSize)

msg = "Message from Server {}".format(msgFromServer[0])
print(msg)

출력:

Message from Server b"Hello UDP Client"

관련글

반응형

+ Recent posts