導航:首頁 > 編程語言 > pythontcprecv

pythontcprecv

發布時間:2022-09-04 12:04:12

python sock.recv最大能接收多少

不同操作系統不同,由TCP協議定,比如
linux 2.6.6 :/proc/sys/net/core/rmem_max:
4194304 //4M

查看/proc/sys/net/core/wmem_max:

8388608 //8M

所以,能設置的接收緩沖區的最大值是8M,發送緩沖區的最大值是16M。

Ⅱ Python TCP連接 伺服器(Server)如何指定埠發送信息

一般來說伺服器的埠需要是固定的,否則無法發起連接。客戶端的埠可以是隨機的。

Ⅲ python 2.7中有沒有socketserver這個模塊

Python提供了兩個基本的socket模塊。一個是socket,它提供了標準的BSD Socket API;另一個是socketServer,它提供了伺服器中心類,可以簡化網路伺服器的開發。
本文簡要介紹socket模塊包含的類及其使用。
1.開始了解socket模塊前,先熟悉下Python的網路編程模塊主要支持的兩種Intent協議:TCP和UDP。TCP協議是一種面向連接的可靠協議,用於建立機器之間的雙向通信流。UDP協議是一種較低級別的、以數據包為基礎的協議(無連接傳輸模式)。與TCP不同,UDP信息不可靠。
他們的區別如下圖所示:左圖為TCP連接協議,右圖為UDP連接協議

2.socket模塊的部分類方法介紹

類方法

說明

socket.socket(family, type[,proto])

創建並返回一個新的 socket對象

socket.getfqdn(name)

將使用點號分隔的 IP地址字元串轉換成一個完整的域名

socket.gethostbyname(hostname)

將主機名解析為一個使用點號分隔的 IP地址字元串

socket.gethostbyname_ex(name)

它返回一個包含三個元素的元組,從左到右分別是給定地址的主要的主機名、同一IP地址的可選的主機名的一個列表、關於同一主機的同一介面的其它IP地址的一個列表(列表可能都是空的)。

socket.gethostbyaddr(address)

作用與gethostbyname_ex相同,只是你提供給它的參數是一個IP地址字元串

Socket.getservbyname(service,protocol)

它要求一個服務名(如'telnet'或'ftp')和一個協議(如'tcp'或'udp'),返回服務所使用的埠號

socket.fromfd(fd, family, type)

從現有的文件描述符創建一個 socket對象

3.socket對象的部分方法介紹

實例方法

說明

sock.bind( (adrs, port) )

將 socket綁定到一個地址和埠上

sock.accept()

返回一個客戶機 socket(帶有客戶機端的地址信息)

sock.listen(backlog)

將 socket設置成監聽模式,能夠監聽 backlog 外來的連接請求

sock.connect( (adrs, port) )

將 socket連接到定義的主機和埠上

sock.recv( buflen[, flags] )

從 socket中接收數據,最多 buflen 個字元

sock.recvfrom( buflen[, flags] )

從 socket中接收數據,最多 buflen 個字元,同時返回數據來源的遠程主機和埠號

sock.send( data[, flags] )

通過 socket發送數據

sock.sendto( data[, flags], addr )

通過 socket發送數據

sock.close()

關閉 socket

sock.getsockopt( lvl, optname )

獲得指定 socket 選項的值

sock.setsockopt( lvl, optname, val )

設置指定 socket選項的值

4.編寫socket測試程序
(a)編寫server的步驟

第一步是創建socket對象。調用socket構造函數。如:
socket = socket.socket( family, type )
family參數代表地址家族,可為AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族用於同一台機器上的進程間通信。
type參數代表套接字類型,可為SOCK_STREAM(流套接字)和SOCK_DGRAM(數據報套接字)。
第二步是將socket綁定到指定地址。這是通過socket對象的bind方法來實現的:
socket.bind( address )
由AF_INET所創建的套接字,address地址必須是一個雙元素元組,格式是(host,port)。host代表主機,port代表埠號。如果埠號正在使用、主機名不正確或埠已被保留,bind方法將引發socket.error異常。
第三步是使用socket套接字的listen方法接收連接請求。
socket.listen( backlog )
backlog指定最多允許多少個客戶連接到伺服器。它的值至少為1。收到連接請求後,這些請求需要排隊,如果隊列滿,就拒絕請求。
第四步是伺服器套接字通過socket的accept方法等待客戶請求一個連接。
connection, address = socket.accept()
調 用accept方法時,socket會時入「waiting」狀態。客戶請求連接時,方法建立連接並返回伺服器。accept方法返回一個含有兩個元素的元組(connection,address)。第一個元素connection是新的socket對象,伺服器必須通過它與客戶通信;第二個元素 address是客戶的Internet地址。
第 五步是處理階段,伺服器和客戶端通過send和recv方法通信(傳輸 數據)。伺服器調用send,並採用字元串形式向客戶發送信息。send方法返回已發送的字元個數。伺服器使用recv方法從客戶接收信息。調用recv 時,伺服器必須指定一個整數,它對應於可通過本次方法調用來接收的最大數據量。recv方法在接收數據時會進入「blocked」狀態,最後返回一個字元 串,用它表示收到的數據。如果發送的數據量超過了recv所允許的,數據會被截短。多餘的數據將緩沖於接收端。以後調用recv時,多餘的數據會從緩沖區 刪除(以及自上次調用recv以來,客戶可能發送的其它任何數據)。
傳輸結束,伺服器調用socket的close方法關閉連接。
(b)編寫client的步驟
首先創建一個socket以連接伺服器:socket =socket.socket( family, type )
使用socket的connect方法連接伺服器。對於AF_INET家族,連接格式如下:
socket.connect( (host,port) )
host代表伺服器主機名或IP,port代表伺服器進程所綁定的埠號。如連接成功,客戶就可通過套接字與伺服器通信,如果連接失敗,會引發socket.error異常。
處理階段,客戶和伺服器將通過send方法和recv方法通信。
傳輸結束,客戶通過調用socket的close方法關閉連接。
5.實例源碼:python socket半雙工聊天
(a)tcpserver.py
[python] view plain
# -*- coding: cp936 -*-
#file:tcpserver.py

import socket
from time import ctime
import sys

bufsize = 1024
host = '127.0.0.1'
port = 8100
address = (host,port)

server_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_sock.bind(address)
server_sock.listen(1)

while True:
print 'waiting for connection...'
clientsock,addr = server_sock.accept()
print 'received from :',addr

while True:
data = clientsock.recv(bufsize)
print ' 收到---->%s\n%s' %(ctime(),data)
data = raw_input("發送----->")
clientsock.send(data)
clientsock.close()

server_sock.close()
(b)tcpclient.py
[python] view plain
## -*- coding: cp936 -*-
##file:tcpclient.py

from socket import *
from time import ctime

bufsize = 1024
host = '127.0.0.1'
port = 8100
addr = (host,port)

client_sock = socket(AF_INET,SOCK_STREAM)
client_sock.connect(addr)

while True:
data = raw_input("發送---->")
if not data:
break
else:
client_sock.send(data)
data = client_sock.recv(bufsize)
print '收到---->%s\n%s' %(ctime(),data)

client_sock.close()

Ⅳ python 伺服器,客戶端編程同機運行連接問題

哪本書上的例子?不是所有人都有你看的書的,你最起碼把書名說一下。
最好能貼出代碼和錯誤信息。這樣別人也可以給你看是什麼原因的錯誤。

還有一個建議,也是別人給我的建議就是:問問題時也要好好組織語言,盡量清楚的描述你的問題,如果你用一句話提問,別人也可能只用一句話回答敷衍了事。如果你認真的寫問題別人看明白了,也可能認真的給你回答。

Ⅳ python socketserver和socket的區別

區別:

1.首先介紹下socket

socket的英文原義是「孔」或「插座」。作為BSD UNIX的進程通信機制,取後一種意思。通常也
稱作"套接字",用於描述IP地址和埠,是一個通信鏈的句柄,可以用來實現不同虛擬機或不同計算機之間的通信。在Internet上的主機一 般運行了多個服務軟體,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個埠上,不同的埠對應於不同的服務。Socket正如其英文原 意那樣,像一個多孔插座。一台主機猶如布滿各種插座的房間,每個插座有一個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟體將插頭插到不同編號的插座,就可以得到不同的服務

內部調用流程為:

啟動服務端程序

執行 TCPServer.init方法,創建服務端Socket對象並綁定 IP 和 埠

執行 BaseServer.init方法,將自定義的繼承自SocketServer.BaseRequestHandler 的類 - MyRequestHandle賦值給 self.RequestHandlerClass

執行 BaseServer.server_forever 方法,While 循環一直監聽是否有客戶端請求到達 ...
當客戶端連接到達伺服器

執行 ThreadingMixIn.process_request 方法,創建一個 「線程」 用來處理請求

執行 ThreadingMixIn.process_request_thread 方法

執行 BaseServer.finish_request 方法,執行 self.RequestHandlerClass() 即:執行 自定義 MyRequestHandler 的構造方法(自動調用基類BaseRequestHandler的構造方法,在該構造方法中又會調用 MyRequestHandler的handle方法)

ForkingTCPServer

ForkingTCPServer和ThreadingTCPServer的使用和執行流程基本一致,只不過在內部分別為請求者建立 「線程」 和 「進程」。

Ⅵ python socket半雙工聊天怎麼運行

#coding=utf-8
importsocket#載入socket模塊
fromtimeimportctime#載入time模塊ctime類

HOST=''#設置主機IP,為空則表示本機上所有的網卡ip。
PORT=3300#設置埠號
BUSIZ=1024#設置數據緩沖區,1KB
ADDR=(HOST,PORT)

defcloseTCnt():#
TCntSock.close()
print"Sessionclosing.."

TSerSock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#創建一個TCPsokcet
TSerSock.bind(ADDR)#綁定TCPsocket的地址和埠
TSerSock.listen(1)#只接收一個請求,如後續後其他請求則會被拒絕
try:
whileTrue:
print'Waittingforconnection...'
(TCntSock,cntAddr)=TSerSock.accept()#TSerSock.accept返回一個(conn,addr)的元組。conn是一個socket對象,而addr是客戶端IP地址和埠
print'...connectionfrom:',cntAddr

try:

whileTrue:
rData=TCntSock.recv(BUSIZ)#接收客戶端信息
ifnotrData:
continue
elifrData=='quit':#當收到『quit』後關閉TCntSock並等待下一次鏈接
break
else:
print'From[%s]%s %s'%(cntAddr[0],ctime(),rData)


whileTrue:
sData=raw_input('I:>')
ifnotsData:
continue
else:
TCntSock.send('From[%s]%s %s'%
(cntAddr[0],ctime(),sData))#發送伺服器信息。
break

exceptsocket.error,detail:#發生錯誤是關閉TCntSock,輸出錯誤信息並等待下一次鏈接
printdetail
closeTCnt()

finally:
TSerSock.close()
#coding=utf-8
importsocket
HOST='localhost'#設置要鏈接的主機的IP
PORT=3300#設置要鏈接的主機埠號
BUFSIZ=1024#設置緩沖區大小,設定為1K
ADDR=(HOST,PORT)
tryCon=0

defTCnt():
tcpCliSock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
whileTrue:
try:
tcpCliSock.connect(ADDR)#與服務端鏈接
except:
printu"正在嘗試連接遠程主機"
tryCon+=1
iftryCon==3:
printu"無法連接上遠程主機,請稍後再試"
exit()
else:
break
printu'登陸成功(通訊結束請輸入"quit"退出) '

try:
whileTrue:
data=raw_input('I:>')
ifnotdata:
continue
elifdata=='quit':#通知服務端工作完成
tcpCliSock.send(data)
break
else:
tcpCliSock.send(data)

whileTrue:
data=tcpCliSock.recv(BUFSIZ)

ifnotdata:
continue
else:
printdata
break
exceptsocket.error,e:
print"Sessionclosing"
printe
tcpCliSock.close()

if__name__=="__main__":
TCnt()

Ⅶ PYTHON UDP/TCP 伺服器與客戶端如何連接

你沒有編程經驗,一來就搞網路編程,你是天才嗎?
先從編程的最基本概念開始學起吧。先買本《python基礎教程》把前面基礎的部分讀懂了,上機實踐。遇到錯誤信息了,自己去網路查找錯誤的原因。

至於你說的這幾個函數,幫助手冊上都有詳細說明的。
變數A=5,不能直接通過網路傳遞,網路只能傳二進制數據。你的變數需要串列化,比如變成字元串或者base64編碼,才能傳遞,到了服務端要根據你事先定義好的協議去解析,才能重新得到這個變數。

Ⅷ 請問,我要用python語言實現socket編程,請問需要下載什麼軟體呢 急需啊~!!!!先謝謝了!

我從網上給你拷兩個例子

伺服器

#!/usr/bin/python
"USAGE:echoserver.py<port>"
,TCPServer
importsys,socket

classEchoHandler(BaseRequestHandler):
defhandle(self):
print"Clientconnected:",self.client_address
self.request.sendall(self.request.recv(2**16))
self.request.close()
iflen(sys.argv)!=2:
print__doc__
else:
TCPServer(('',int(sys.argv[1])),EchoHandler).serve_forever()

客戶端

#!/usr/bin/python
"USAGE:echoclient.py<server><word><port>"
fromsocketimport*
importsys
iflen(sys.argv)!=4:
print__doc__
sys.exit(0)
sock=socket(AF_INET,SOCK_STREAM)
sock.connect((sys.argv[1],int(sys.argv[3])))
message=sys.argv[2]
messlen,received=sock.send(message),0
ifmesslen!=len(message):
print"Failedtosendcompletemessage"
print"Received:",
whilereceived<messlen:
data=sock.recv(32)
sys.stdout.write(data)
received+=len(data)
print
sock.close()

Ⅸ 在linux下,python怎麼才能抓到網卡上的所有TCP數據包

Ethereal 自帶許多協議的 decoder,簡單,易用,基於winpcap的一個開源的軟體.但是它的架構並不靈活,如何你要加入一個自己定義的的解碼器,得去修改 Ethereal的代碼,再重新編譯,很煩瑣.對於一般的明文 協議,沒有什麼問題,但是對於加密協議,比如網路游戲,客戶端程序一般會在剛連接上的時候,發送一個隨機密鑰,而後的報文都會用這個密鑰進行加密,如此. 要想破解,得要有一個可編程的抓包器.
libpcap是一個不錯的選擇,但是對於抓包這樣需要反復進行」試 驗->修改」這個過程的操作,c 語言顯然不是明智的選擇.
Python提供了幾個libpcapbind。在windows平台上,你需要先安裝winpcap,如果你已經安裝了Ethereal非常好用
一個規范的抓包過程
import pcap
import dpkt
pc=pcap.pcap() #注,參數可為網卡名,如eth0
pc.setfilter('tcp port 80') #設置監聽過濾器
for ptime,pdata in pc: #ptime為收到時間,pdata為收到數據
print ptime,pdata #...
對抓到的乙太網V2數據包(raw packet)進行解包
p=dpkt.ethernet.Ethernet(pdata)
if p.data.__class__.__name__=='IP':
ip='%d.%d.%d.%d'%tuple(map(ord,list(p.data.dst)))
if p.data.data.__class__.__name__=='TCP':
if data.dport==80:
print p.data.data.data # by gashero
一些顯示參數
nrecv,ndrop,nifdrop=pc.stats()
返回的元組中,第一個參數為接收到的數據包,(by gashero)第二個參數為被核心丟棄的數據包。

Ⅹ 如何利用Python嗅探數據包

一提到Python獲取數據包的方式,相信很多Python愛好者會利用Linux的libpcap軟體包或利用Windows下的WinPcap可移植版的方式進行抓取數據包,然後再利用dpkt軟體包進行協議分析,我們這里想換一個角度去思考:1.Python版本的pcap存儲內存數據過小,也就是說緩存不夠,在高並發下容易發生丟包現象,其實C版本的也同樣存在這樣的問題,只不過Python版本的緩存實在是過低,讓人很郁悶。2.dpkt協議分析並非必須,如果你對RFC791和RFC793等協議熟悉的話,完全可以使用struct.unpack的方式進行分析。如果你平常習慣使用tcpmp抓取數據包的話,完全可以使用它來代替pcap軟體包,只不過我們需要利用tcpmp將抓取的數據以pcap格式進行保存,說道這里大家一定會想到Wireshark工具,具體命令如下:tcpmpdst10.13.202.116andtcpdstport80-s0-ieth1-w../pcap/tcpmp.pcap-C1k-W5我們首先需要對pcap文件格式有所了解,具體信息大家可以參考其他資料文檔,我這里只說其重要的結構體組成,如下:sturctpcap_file_header{DWORDmagic;WORDversion_major;WORDversion_minor;DWORDthiszone;DWORDsigfigs;DWORDsnaplen;DWORDlinktype;}structpcap_pkthdr{structtimevalts;DWORDcaplen;DWORDlen;}structtimeval{DWORDGMTtime;DWORDmicroTime;}這里需要說明的一點是,因為在Python的世界裡一切都是對象,所以往往Python在處理數據包的時候感覺讓人比較麻煩。Python提供了幾個libpcapbind,這里有一個最簡單的。在windows平台上,你需要先安裝winpcap,如果你已經安裝了Ethereal非常好用。一個規范的抓包過程:importpcapimportdpktpc=pcap.pcap()#注,參數可為網卡名,如eth0pc.setfilter('tcpport80')#設置監聽過濾器forptime,pdatainpc:#ptime為收到時間,pdata為收到數據printptime,pdata#對抓到的乙太網V2數據包(rawpacket)進行解包:p=dpkt.ethernet.Ethernet(pdata)ifp.data.__class__.__name__=='IP':ip='%d.%d.%d.%d'%tuple(map(ord,list(p.data.dst)))ifp.data.data.__class__.__name__=='TCP':ifdata.dport==80:printp.data.data.data一些顯示參數nrecv,ndrop,nifdrop=pc.stats()返回的元組中,第一個參數為接收到的數據包,第二個參數為被核心丟棄的數據包。至於對於如何監控tcpmp生成的pcap文件數據,大家可以通過pyinotify軟體包來實現,如下:classPacker(pyinotify.ProcessEvent):def__init__(self,proct):self.proct=proctself.process=Nonedefprocess_IN_CREATE(self,event):logger.debug("createfile:%sinqueue"%self.process_IF_START_THREAD(event))defprocess_IN_MODIFY(self,event):self.process_IF_START_THREAD(event)logger.debug("modifyfile:%sinqueue"%self.process_IF_START_THREAD(event))defprocess_IN_DELETE(self,event):filename=os.path.join(event.path,event.name)logger.debug("deletefile:%s"%filename)defprocess_IF_START_THREAD(self,event):filename=os.path.join(event.path,event.name)iffilename!=self.process:self.process=filenameself.proct.put(filename)ifself.proct.qsize()>1:try:logger.debug("createconsumerproct.qsize:%s"%self.proct.qsize())consumer=Consumer(self.proct)consumer.start()exceptException,errmsg:logger.error("createconsumerfailed:%s"%errmsg)returnfilenameclassFactory(object):def__init__(self,proct):self.proct=proctself.manager=pyinotify.WatchManager()self.mask=pyinotify.IN_CREATE|pyinotify.IN_DELETE|pyinotify.IN_MODIFYdefwork(self):try:try:notifier=pyinotify.ThreadedNotifier(self.manager,Packer(self.proct))notifier.start()self.manager.add_watch("../pcap",self.mask,rec=True)notifier.join()exceptException,errmsg:logger.error("createnotifierfailed:%s"%errmsg)exceptKeyboardInterrupt,errmsg:logger.error("factoryhasbeenterminated:%s"%errmsg)在獲得要分析的pcap文件數據之後,就要對其分析了,只要你足夠了解pcap文件格式就可以了,對於我們來講只需要獲得TCP數據段的數據即可,如下:classWriter(threading.Thread):def__init__(self,proct,stack):threading.Thread.__init__(self)self.proct=proctself.stack=stackself.pcap_pkthdr={}defrun(self):whileTrue:filename=self.proct.get()try:f=open(filename,"rb")readlines=f.read()f.close()offset=24whilelen(readlines)>offset:self.pcap_pkthdr["len"]=readlines[offset+12:offset+16]try:length=struct.unpack("I",self.pcap_pkthdr["len"])[0]self.stack.put(readlines[offset+16:offset+16+length])offset+=length+16exceptException,errmsg:logger.error("unpackpcap_pkthdrfailed:%s"%errmsg)exceptIOError,errmsg:logger.error("openfilefailed:%s"%errmsg)在獲得TCP數據段的數據包之後,問題就簡單多了,根據大家的具體需求就可以進行相應的分析了,我這里是想分析其HTTP協議數據,同樣也藉助了dpkt軟體包進行分析,如下:defworker(memcache,packet,local_address,remote_address):try:p=dpkt.ethernet.Ethernet(packet)ifp.data.__class__.__name__=="IP":srcip="%d.%d.%d.%d"%tuple(map(ord,list(p.data.src)))dstip="%d.%d.%d.%d"%tuple(map(ord,list(p.data.dst)))ifp.data.data.__class__.__name__=="TCP":tcpacket=p.data.dataiftcpacket.dport==80anddstip==local_address:srcport=tcpacket.sportkey=srcip+":"+str(srcport)iftcpacket.data:ifnotmemcache.has_key(key):memcache[key]={}ifnotmemcache[key].has_key("response"):memcache[key]["response"]=Noneifmemcache[key].has_key("data"):memcache[key]["data"]+=tcpacket.dataelse:memcache[key]["data"]=tcpacket.dataelse:ifmemcache.has_key(key):memcache[key]["response"]=dpkt.http.Request(memcache[key]["data"])try:stackless.tasklet(connection)(memcache[key]["response"],local_address,remote_address)stackless.run()exceptException,errmsg:logger.error("connectremoteremote_addressfailed:%s",errmsg)logger.debug("oldheaders(nonecontent-length):%s",memcache[key]["response"])memcache.pop(key)exceptException,errmsg:logger.error("dpkt.ethernet.Ethernetfailedinworker:%s",errmsg)如果大家只是想單純的獲取IP地址、埠、流量信息,那麼問題就更簡單了,這里只是拋磚引玉。另外再提供一段代碼供參考:importpcap,dpkt,structimportbinasciidefmain():a=pcap.pcap()a.setfilter('udpportrange4000-4050')try:fori,pdataina:p=dpkt.ethernet.Ethernet(pdata)src='%d.%d.%d.%d'%tuple(map(ord,list(p.data.src)))dst='%d.%d.%d.%d'%tuple(map(ord,list(p.data.dst)))sport=p.data.data.sportdport=p.data.data.dport =int(binascii.hexlify(p.data.data.data[7:11]),16)print' :%d,From:%s:%d,To:%s:%d'%( ,src,sport,dst,dport)exceptException,e:print'%s'%en=raw_input()if__name__=='__main__':main()

閱讀全文

與pythontcprecv相關的資料

熱點內容
unix網路編程卷4 瀏覽:806
找靚機app下單什麼時候發貨 瀏覽:411
android一個應用兩個進程 瀏覽:801
linux硬碟復制 瀏覽:806
php圖片伺服器搭建 瀏覽:798
下載壓縮文件怎麼打開 瀏覽:192
新建文件夾叫什麼名字 瀏覽:565
windows20的開機命令 瀏覽:332
微信一般在電腦的那個文件夾 瀏覽:509
go在win7下編譯特別慢 瀏覽:256
光遇ios耳機安卓為什麼沒有 瀏覽:904
小米手機桌面文件夾經常自動散開 瀏覽:607
小米電話手錶用什麼app進行設置 瀏覽:265
虛擬列印機pdf下載 瀏覽:671
jdk編譯運行方法 瀏覽:459
android執行shell命令 瀏覽:349
程序員頭像女 瀏覽:57
有什麼可以變頭發顏色的app 瀏覽:935
玩具解壓屋游戲下載 瀏覽:849
我的世界拔刀劍伺服器地址id 瀏覽:891