基本套接字呼叫

2021-06-29 06:23:10 字數 1536 閱讀 4352

linux支援伯克利(bsd)風格的套接字程式設計。它同時支援面向連線和無連線型別的套接字。在面向連線的通訊中,伺服器和客戶機在交換資料之前要先建立乙個連線。在無連線通訊中資料被作為資訊的一部分被交換。無論哪一種方式,伺服器總是最先啟動,把自己繫結(banding)在乙個套接字上然後偵聽資訊。伺服器究竟怎樣試圖去偵聽就得依靠你程式設計所設定的連線型別了。

3.1 socket()函式

3.2 bind()函式

3.3 connect()函式

再次強調,一定要檢測connect()的返回值:如果發生了錯誤(比如無法連線到遠端主機,或是遠端主機的指定埠無法進行連線等)它將會返回錯誤值-1。全域性變數errno將會儲存錯誤**。基本上,我們並不在乎我們本地用什麼埠來通訊,是不是?我們在乎的是我們連到哪台主機的哪個埠上。linux核心自動為我們選擇了乙個沒有被使用過的本地埠。

3.4 listen()函式

listen()函式是等待別人來連線,進行系統偵聽請求的函式。當有人連線你的時候,需要做兩步:通過listen()函式等待連線請求,然後使用accept()函式來處理。

如果你想在乙個埠上接受外來連線請求的話,那麼函式的呼叫順序為:

socket();

bind();

listen();

/* 在這裡呼叫accept()函式 */

......

3.5 accept()函式

如果accept()失敗的話,accept()函式會返回乙個-1來表明呼叫失敗,同時全域性變數errno將會儲存錯誤**。

面向連線的通訊中客戶機要做如下一些事:

呼叫乙個socket()函式建立乙個套接字;

呼叫乙個connect()函式試圖連線服務;

如果連線成功呼叫,wirte()函式請求資料,呼叫read()函式接收引入的應答。

3.6 send()、recv()函式

這兩個函式是最基本的。

send()函式在呼叫後會返回它真正傳送的資料的長度。

注意:send()所傳送的資料可能少於你給它的引數所制定的長度!

因為,如果你給send()的引數中包含的資料的長度遠遠大於send()所能一次傳送的資料,則send()函式只能傳送它所能傳送的最大資料長度,然後它相信你會把剩下的資料再次呼叫它來進行第二次傳送。所以,記住,如果send()函式的返回值小於len的話,則你需要再次傳送剩下的資料。幸運的是,如果包足夠小(小於ik),那麼send()一般都會一次傳送光的。

3.7 sendto()、recvfrom()函式

這兩個函式是進行無連線的udp通訊時使用的。使用這兩個函式,則資料會在沒有建立過任何連線的網路上傳輸。因為資料報套接字無法對遠端主機進行連線,想想我們在傳送資料前需要知道些什麼呢?

ps: 取得遠端主機的ip位址和埠!

注意:如果你使用connect()連線到了乙個資料報套接字的伺服器程式上,那麼你就可以使用send()和recv()函式來傳輸你的資料,不要以為你在使用乙個流式的套接字,你所使用的仍然是乙個使用者資料報的套接字,只不過套接字介面在send()和recv()的時候自動幫助你加上了目標位址,目標埠的資訊。

基本套接字函式

一 socket函式 為了執行網路i o,乙個程序必須做的第一件事就是呼叫socket函式,指定期望的通訊協議型別。int socket int family,int type,int protocol 成功則返回正數,出錯返回 1 sockfd socket af inet,sock stream...

基本套接字程式設計(7) udp篇

udp 是user datagram protocol的簡稱,中文名是使用者資料報協議,是osi open system interconnection,開放式系統互聯 參考模型中一種無連線的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務,ietf rfc 768是udp的正式規範。udp在ip報...

NOIP Dp基本套路大全

dp,一直是困擾許 我 許 這 多 一 多 個 oler 蒟蒻 的問題之一。而在看似毫無章法與固定解題模式的dp題中,卻實實在在有那麼一些基本套路,幫助我們在求解dp的過程中能給我們或多或少提 多 供 騙 一些思 水 路 分 持續更新中。求大佬指正orz。p.s 以下的狀態轉移方程只是最基礎的,不含...