• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed python gniazdo nieblokującu

Object Storage Arubacloud
+1 głos
156 wizyt
pytanie zadane 1 marca 2020 w Python przez edwardkraweznik Dyskutant (9,930 p.)
zamknięte 1 marca 2020 przez edwardkraweznik

Witam.

Jak w pythonie zrobić gniazdo nieblokujące ?

mam taki komunikat:

Traceback (most recent call last):
  File "limit.py", line 36, in <module>
    conn.sendall("action=dunno\n\n")
  File "/usr/lib/python2.7/socket.py", line 228, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 32] Broken pipe

import socket

HOST = 'localhost'
PORT = 2121
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()

while 1:

    sender = ''
    sasl_username = ''

    data = conn.recv(10240)
    data = data.split('\n') #--- tablica \n request=smtpd_access_policy

    length = len(data) #rozmiar tabeli data

    for x in range(length):
        print data[x]

        query = data[x].split('=')

        if query[0] == 'sender' and query[1] != '':
            sender = query[1]

        if query[0] == 'sasl_username' and query[1] != '':
            sasl_username = query[1]

#    conn.sendall("action=defer_if_permit Sendmail limit\n\n")
#----------------------------------------------------------------

    if sasl_username == '': #---gdy sender nie jest lokalny poczta z zewnatrz do mhelmet
        print sender
        conn.sendall("action=dunno\n\n")
 #       conn.close()
    else:
        print sender
        print sasl_username
        conn.sendall("action=defer_if_permit Sendmail limit\n\n")
#        conn.close()

#    break

#close
#    if not data: break
#conn.close()

podejrzewam, że problem jest związany z gniazdem, które się blokuje.

zgodnie z dokumentacją postfixa skrypt nie może zamykać połączenia ponieważ zostanie ono wykorzystane ponownie: http://www.postfix.org/SMTPD_POLICY_README.html

Skrypt działa ale tylko za pierwszym razem. kolejne zapytania wywalają błąd.

komentarz zamknięcia: rozwiązane

1 odpowiedź

+1 głos
odpowiedź 1 marca 2020 przez edwardkraweznik Dyskutant (9,930 p.)

Udało się to zrobić na wielu wątkach poniżej przykład, może komuś się przyda:

import multiprocessing
import socket
import threading

HOST = 'localhost'
PORT = 2121
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)

def handle(conn, add):
    while 1:
#------------------------------------------------------------

        sender = ''
        sasl_username = ''

        data = conn.recv(10240)
        data = data.split('\n') #--- tablica \n request=smtpd_access_policy

        length = len(data) #rozmiar tabeli data

        for x in range(length):

            query = data[x].split('=')

            if query[0] == 'sender' and query[1] != '':
                sender = query[1]

            if query[0] == 'sasl_username' and query[1] != '':
                sasl_username = query[1]

#    conn.sendall("action=defer_if_permit Sendmail limit\n\n")
#----------------------------------------------------------------
#----------------------------------------------------------------

        if sasl_username == '': #---gdy sender nie jest lokalny poczta z zewnatrz do mhelmet
            print sender
            conn.sendall("action=dunno\n\n")

        else:

            print sender
            print sasl_username
            conn.sendall("action=defer_if_permit Sendmail limit\n\n")



        if not data: break

    conn.close()

#-----------------------------------------------------------------
#-----------------------------------------------------------------

while True:
    conn, addr = s.accept()
    t = multiprocessing.Process(target=handle, args=(conn,addr))
    t.start()

#-----------------------------------------------------------------

 

Podobne pytania

0 głosów
1 odpowiedź 129 wizyt
pytanie zadane 29 kwietnia 2022 w Sieci komputerowe, internet przez Szyszkus Nowicjusz (200 p.)
0 głosów
1 odpowiedź 141 wizyt
pytanie zadane 18 kwietnia 2019 w Urządzenia mobilne przez Danielski Nowicjusz (120 p.)
0 głosów
1 odpowiedź 441 wizyt
pytanie zadane 26 lutego 2017 w Sprzęt komputerowy przez Zychu Użytkownik (710 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...