簡體   English   中英

python-如何獲取套接字連接狀態?

[英]python - how to get socket connection state?

嗨!

我是python的初學者,我想在這里問。 我有代碼。 當我單擊按鈕(btn_connect)時,套接字將連接到電視(函數self.connection())。 有沒有辦法檢查套接字連接並獲得連接或斷開連接? 我想將其寫入文本字段,例如“狀態:已連接”

這是我的代碼:

import fcntl, socket, struct
import base64
import time, datetime
import netifaces
from Tkinter import *

def getMyMac1(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    info = fcntl.ioctl(s.fileno(), 0x8927,  struct.pack('256s', ifname[:15]))
    return '-'.join(['%02x' % ord(char) for char in info[18:24]])


myip = netifaces.ifaddresses(netifaces.gateways()['default'][netifaces.AF_INET][1])[netifaces.AF_INET][0]['addr']
mymac = getMyMac1(netifaces.gateways()['default'][netifaces.AF_INET][1])
appstring = "Pepin's Samsung TV Remote"
remotename = "Pepin's Samsung TV Remote"

def sendKey(skey, dataSock, appstring):
 messagepart3 = chr(0x00) + chr(0x00) + chr(0x00) + chr(len(
base64.b64encode(skey))) + chr(0x00) + base64.b64encode(skey);
 part3 = chr(0x00) + chr(len(appstring)) + chr(0x00) \
+ appstring + chr(len(messagepart3)) + chr(0x00) + messagepart3
 dataSock.send(part3);

root = Tk()
root.title("Pepin's Samsung TV Remote")
root.geometry("391x595")

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ipencoded = base64.b64encode(myip)
macencoded = base64.b64encode(mymac)

messagepart1 = chr(0x64) + chr(0x00) + chr(len(ipencoded)) \
+ chr(0x00) + ipencoded + chr(len(macencoded)) + chr(0x00) \
+ macencoded + chr(len(base64.b64encode(remotename))) + chr(0x00) \
+ base64.b64encode(remotename)
part1 = chr(0x00) + chr(len(appstring)) + chr(0x00) + appstring \
+ chr(len(messagepart1)) + chr(0x00) + messagepart1
messagepart2 = chr(0xc8) + chr(0x00)
part2 = chr(0x00) + chr(len(appstring)) + chr(0x00) + appstring \
+ chr(len(messagepart2)) + chr(0x00) + messagepart2

class Application():
    """Pepin's Samsung TV Remote"""

    def __init__(self, master):

        self.master = master
        self.create_widgets()

    def connection(self):

        sock.connect((self.entry_tvip.get(), 55000))
        sock.send(part1)
        sock.send(part2)

        self.tvappstring = app.entry_tvappstring.get()

    def create_widgets(self):

        label_tvip = Label(self.master, text="TV IP:")
        label_tvip.grid(row=3, column=3, columnspan=1, padx=(15,0), ipady=8)

        self.entry_tvip = Entry(self.master, width=16)
        self.entry_tvip.grid(row=3, column=4, columnspan=3, ipady=8)

        label_tvappstring = Label(self.master, text="TV MODEL (Tv App String)")
        label_tvappstring.grid(row=4, column=3, columnspan=4, padx=(15,0), ipady=8, sticky=W)

        self.entry_tvappstring = Entry(self.master, width=22)
        self.entry_tvappstring.grid(row=5, column=3, columnspan=4, padx=(15,0), ipady=8)
        self.entry_tvappstring.insert(0, "UE55C8000")

        btn_connect = Button(self.master, text = "CONNECT TO TV", width=19, height=2, command = lambda: self.connection()) 
            btn_connect.grid(row=6, column=3, columnspan=5, padx=(15,0))     

app = Application(root)
root.mainloop()

sock.close()

請幫我。 謝謝!

連接的插座:

您的流連接的套接字塊和recv()在另一端關閉時返回“”。 所以有你的身份。

UDP:

數據報UDP套接字被廣播,因此狀態與連接的狀態相比有點模糊。

您的電視產品肯定有有關UDP流程的文檔,對嗎? 例如sendto()狀態請求或等效概念。

http://www.binarytides.com/programming-udp-sockets-in-python/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM