Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Pieni SIP-serveri

Palvy [30.11.2012 04:50:42]

#

Tässä aloittelen pienen SIP-serverin toteutusta, ja ihan ensimmäiseksi haluaisin saada serverin vastaanottamaan ensimmäisen SIP-viestin (tai minkä tahansa viestin), jonka SIP-clientti lähettää. Alla on serverin toteutus Pythonilla. Käsittääkseni kaikki SIP-clientit (esim. Linphone, Ekiga,...) käyttävät UDP-protokollaa, joten serveri kuuntelee UDP-liikennettä käyttäjän määrittelemästä portista (annetaan komentoriviparametrina). SIP-clientin ensimmäinen viesti serverille pitäisi protokollan mukaisesti olla SIP INVITE, joten ao. serverin pitäisi se saada vastaanotettua ja tulostettua.

Kysymys kuuluukin, mikä olisi se oikea komento jolla saisi tuon soittoyrityksen tehtyä jollakin clientilla. Olen yrittänyt mm. seuraavia komentoja komentorivi-Ekigalla (Ubuntulla) serverin kuunnellessa porttia 6000, mutta serveri ei saa mitään viestiä clientilta:

ekiga -c sip:test@localhost:6000
ekiga -c sip:test@127.0.0.1:6000

En ehkä osaa käyttää noita clientteja oikein, eli pitääkö tuo vastaanottaja "test" olla määritelty jossain ennenkuin clientti edes yrittää soittaa siihen (=lähettää SIP INVITE:n)?

import argparse
import socket

def server(port_sip):
    HOST = ""
    PORT = port_sip
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind((HOST, PORT))

    while 1:
        try:
            data, addr = s.recvfrom(1024)
            print "Received data from " + str(addr[0]) + ":" + str(addr[1])
            print data # tulostetaan vastaanotettu viesti
        except KeyboardInterrupt:
            break
    s.close()

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-s", "--sip", help="SIP server port", type=int)
    args = parser.parse_args()
    server(args.sip)

Sienikasvusto [01.12.2012 13:21:21]

#

Kannattaa tutkia esimerkiksi tcpdumpilla (tai GUI-interfacen siihen tarjoamalla wiresharkilla) mitä paketteja ekiga lähettää.

Itse ohjelmaan en osaa antaa ohjeita, mutta netistä varmaankin löytyy kasapäin ohjeita ja dokumentaatiota ko. ohjelman käyttöön.

mietinvaan [06.12.2012 01:27:31]

#

Koska ohjelmasi on toistaiseksi näin yksinkertainen, laita se aluksi päälle ja ota siihen telnetillä yhteys. Kirjoittele telnettiin mitä tahansa ja katso saako ohjelmasi syötteen kiinni. Tee tämä testataksesi, että ohjelmasi on varmasti toimiva.

Itse en tiedä Pythonista mitään, mutta muissa ohjelmointikielissä on kohtuullisen tavallista, että palvelinsovelluksissa on aluksi yksi soketti, joka kuuntelee jotain porttia (esim. 80) ja jokaiselle uudelle yhteydelle oma sokettinsa. Tämä välivaihe tavallaan "puuttuu" tuosta, mutta saattaa olla myös Pythonin ominaisuus.

Onhan yhteys muuten tällä hetkellä lokaalista koneesta lokaaliin koneeseen? UDP ei takaa pakettien perille menoa tai oikeaa saapumisjärjestystä.

Metabolix [06.12.2012 01:59:21]

#

mietinvaan, ensimmäiset kappaleet viestistäsi ovat pielessä, nimittäin UDP-sockettiin ei voi yhdistää telnetillä eikä niitä kuulu olla kuin yksi (millään kielellä). Lisäksi paketit kulkevat netissä nykyään melko luotettavasti, joten on epätodennäköistä, että ongelma olisi toistuvasti siinä.

Koodin toimivuuden voisi kyllä tarkistaa vaikka toisella Python-skriptillä tai socat-ohjelmalla – mieluiten sekä samalta koneelta että ulkopuolelta, jotta selviää, onko syy palomuurissa.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta