有關socket的一些學習

2021-08-29 23:30:29 字數 4186 閱讀 8945

有關大創的一些東西。涉及到socket的知識的理解,學習一下。

本人學習使用,如有錯誤,歡迎指出。在此表示感謝。

先查了一下關於socket的百科定義。

「網路上的兩個程式通過乙個雙向的通訊連線實現資料的交換,這個連線的一端稱為乙個socket。」

感覺有點像兩個東西用乙個管子連在一起。管子的兩端稱為socket。這樣看來。socket應該算作是乙個程式設計介面。

socket應該算作應用層和運輸層之間的乙個所謂虛擬出來的乙個層。用於處理相關資料

百科中給了乙個較為有趣的例子來說明:

socket非常類似於**插座。以乙個國家級**網為例,**的通話雙方相當於相互通訊的2個程序,區號是它的網路位址;區內乙個單位的交換機相當於一台主機,主機分配給每個使用者的局內號碼相當於socket號。任何使用者在通話之前,首先要占有一部**機,相當於申請乙個socket;同時要知道對方的號碼,相當於對方有乙個固定的socket。然後向對方撥號呼叫,相當於發出連線請求(假如對方不在同一區內,還要撥對方區號,相當於給出網路位址)。假如對方在場並空閒(相當於通訊的另一主機開機且可以接受連線請求),拿起**話筒,雙方就可以正式通話,相當於連線成功。雙方通話的過程,是一方向**機發出訊號和對方從**機接收訊號的過程,相當於向socket傳送資料和從socket接收資料。通話結束後,一方掛起**機相當於關閉socket,撤消連線。

通過這個例子,我們能夠看出來,socket是進行通訊的不可分的東西。

連線的過程大概為三個步驟。

(1)伺服器監聽:是伺服器端socket並不定位具體的客戶端socket,而是處於等待連線的狀態,實時監控網路狀態。

(2)客戶端請求:是指由客戶端的socket提出連線請求,要連線的目標是伺服器端的socket。為此,客戶端的socket必須首先描述它要連線的伺服器的socket,指出伺服器端socket的位址和埠號,然後就向伺服器端socket提出連線請求。

(3)連線確認:是指當伺服器端socket監聽到或者說接收到客戶端socket的連線請求,它就響應客戶端socket的請求,建立乙個新的執行緒,把伺服器端socket的描述發給客戶端,一旦客戶端確認了此描述,連線就建立好了。而伺服器端socket繼續處於監聽狀態,繼續接收其他客戶端socket的連線請求。

有關於一些常用的函式:

建立:int socket(intdomain, inttype, intprotocol);

注:在使用socket進行建立乙個識別符號的時候,他只存在於相關的協議族當中。若想給他附上乙個具體位址,需要呼叫bind()函式,否則,在進行connect()函式和listen()函式時,系統自動分配乙個。

返回值:如果呼叫成功就返回新建立的套接字的描述符,如果失敗就返回invalid_socket(linux下失敗返回-1)。套接字描述符是乙個整數型別的值。每個程序的程序空間裡都有乙個套接字描述符表,該表中存放著套接字描述符和套接字資料結構的對應關係。該表中有乙個字段存放新建立的套接字的描述符,另乙個字段存放套接字資料結構的位址,因此根據套接字描述符就可以找到其對應的套接字資料結構。每個程序在自己的程序空間裡都有乙個套接字描述符表但是套接字資料結構都是在作業系統的核心緩衝裡。

domain:協議域,又稱協議族。在通訊中必須採用對應的位址,如af_inet決定了要用ipv4位址(32位的)與埠號(16位的)的組合、af_unix決定了要用乙個絕對路徑名作為位址。

type:指定socket型別。常用的socket型別有sock_stream、sock_dgram、sock_raw、sock_packet、sock_seqpacket等。流式socket(sock_stream)是一種面向連線的socket,針對於面向連線的tcp服務應用。資料報式socket(sock_dgram)是一種無連線的socket,對應於無連線的udp服務應用。

protocol:指定協議。常用協議有ipproto_tcp、ipproto_udp、ipproto_stcp、ipproto_tipc等,分別對應tcp傳輸協議、udp傳輸協議、stcp傳輸協議、tipc傳輸協議。

注意:1.type和protocol不可以隨意組合,如sock_stream不可以跟ipproto_udp組合。當第三個引數為0時,會自動選擇第二個引數型別對應的預設協議。

2.windowssocket下protocol引數中不存在ipproto_stcp

繫結:int bind(socketsafdsf,const struct sockaddr*address, socklen_taddress_len);

safdsf即socket的名稱編號。由socket()函式進行建立,並唯一標註某個socket。

在將乙個位址繫結到socket的時候,請先將主機位元組序轉換成為網路位元組序

p.s.

主機位元組序就是我們平常說的大端和小端模式:不同的cpu有不同的位元組序型別,這些位元組序是指整數在記憶體中儲存的順序,這個叫做主機序。引用標準的big-endian和little-endian的定義如下:

a) little-endian就是低位位元組排放在記憶體的低位址端,高位位元組排放在記憶體的高位址端。

b) big-endian就是高位位元組排放在記憶體的低位址端,低位位元組排放在記憶體的高位址端。

網路位元組序:4個位元組的32 bit值以下面的次序傳輸:首先是0~7bit,其次8~15bit,然後16~23bit,最後是24~31bit。這種傳輸次序稱作大端位元組序。由於tcp/ip首部中所有的二進位制整數在網路中傳輸時都要求以這種次序,因此它又稱作網路位元組序。位元組序,顧名思義位元組的順序,就是大於乙個位元組型別的資料在記憶體中的存放順序,乙個位元組的資料沒有順序的問題了。

int listen (intsockfd, intbacklog);

int connect (intsockfd, const struct sockaddr *addr, socklen_taddrlen);

listen函式的第乙個引數即為要監聽的socket描述字,第二個引數為相應socket可以排隊的最大連線個數。socket()函式建立的socket預設是乙個主動型別的,listen函式將socket變為被動型別的,等待客戶的連線請求。

connect函式的第乙個引數即為客戶端的socket描述字,第二引數為伺服器的socket位址,第三個引數為socket位址的長度。客戶端通過呼叫connect函式來建立與tcp伺服器的連線。

接收:int recv(socketsocket, char far*buf, intlen, intflags);

ssize_t recvfrom(intsockfd, voidbuf, intlen, unsigned intflags, struct socketaddr*from, socket_t*fromlen);

傳送:int sendto( sockets, const char far*buf, intsize, intflags, const struct sockaddr far*to, inttolen);

接受連線請求:

int accept( intfd, struct socketaddr*addr, socklen_t*len);

開始的時候定義到socket是兩個程式之間的某些東西。無論socket如何工作,確認好這兩個程式的位置,並進行相關標識都是很必要的。根據tcp/ip協議。我們可以通過三元組(ip位址,協議,埠)就可以標識網路的程式。

關閉:int close (intfd);

socket通訊原理

socket 的一些引數

sock raw 注意一定要在root下使用 原始套接字程式設計可以接收到本機網絡卡上的資料幀或者資料報,對與監聽網路的流量和分析是很有作用的.一共可以有3種方式建立這種socket 1.socket af inet,sock raw,ipproto tcp ipproto udp ipproto ...

socket 的一些麻煩

在vs2010 上面倒是可以編譯的源 但是換到2008上,編譯就出現了如下錯誤資訊。sockaddr in 未宣告的識別符號 包含的標頭檔案是windows.h 最後還是有了結果,就是 在 sockaddr in 的前頭 加上 struct.還有錯誤 error c2275 socket 將此型別用...

一些與機器學習有關的概念

有監督學習是從標籤化訓練資料集中推斷出函式的機器學習任務。訓練資料由一組訓練例項組成。其基本思想是,我們資料集中的每個樣本都有相應的 正確答案 再根據這些樣本作出 就像房子和腫瘤的例子中做的那樣。我們還介紹了回歸問題,即通過回歸來推出乙個連續的輸出,之後我們介紹了分類問題,其目標是推出一組離散的結果...