計畫上遇到了些許困難,

主要是 client 端用 socket 傳送 string data 給 server 端,而 server 端是用 libpcap 來接收資料,

在第二次接收資料時會在client端出現 socket error 的現象( socket.error:[Errno111]Connection refused )

導致socket無法繼續運作,資料也就無法繼續傳了...

我到 stackoverflow 發問,希望大家可以給我些意見 ^ ^

發問網址: Link

經討論後發現 原因在於Server端沒有建立Socket做Binding和Listening,

會造成Client端的Socket做connect連線後,Server端會傳回 ICMP Port Unreachable 的 message

造成第二次連線出現 socket.error:[Errno111]Connection refused 的 Error

解決方法:

Client端不要建立connect的連線用UDP中sendto()此方法來取而代之,

如此Client就可以持續傳資料給Server端,而Server端則利用Libpcap來接收封包資料!!

 

程式碼如下:

#!/usr/bin/env python
# UDP Client - udpclient.py
# code by www.cppblog.com/jerryma
import socket, sys

host = sys.argv[1] #Server IP Address
textport = sys.argv[2] #Server Binding Port

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #socket

try:
    port = int(textport)
except ValueError:
    port = socket.getservbyname(textport, 'udp')

#s.connect((host, port)) #connect 這行要註解掉喔!!

while 1:
    print "Enter data to transmit:"
    data = sys.stdin.readline().strip() #UDP data


    #s.sendall(data) #Send UDP data
    s.sendto(data, (host, port))

    print "Looking for replies; press Ctrl-C or Ctrl-Break to stop."


    print "\n"

創作者介紹
創作者 Wayne Technique Study 的頭像
Wayne

Wayne Technique Study

Wayne 發表在 痞客邦 留言(0) 人氣( 204 )