5 使用套接字進行讀寫

2021-09-29 19:49:16 字數 2149 閱讀 5798

傳送資料

write、send 和 sendmsg。

ssize_t write (

int socketfd,

const

void

*buffer, size_t size)

ssize_t send (

int socketfd,

const

void

*buffer, size_t size,

int flags)

ssize_t sendmsg

(int sockfd,

const

struct msghdr *msg,

int flags)

問題:在套接字描述符上呼叫write函式,和在普通檔案描述符上呼叫write函式行為區別:

傳送緩衝區

當 tcp 三次握手成功,tcp 連線成功建立後,作業系統核心會為每乙個連線建立配套的基礎設施,比如傳送緩衝區。

當我們的應用程式呼叫 write 函式時,實際所做的事情是把資料從應用程式中拷貝到作業系統核心的傳送緩衝區中,並不一定是把資料通過套接字寫出去。

幾種情況:

讀取資料

unix 的世界一切皆檔案

read 函式

ssize_t read (

int socketfd,

void

*buffer, size_t size)

緩衝區實驗例子中客戶端不斷地傳送資料,伺服器端每讀取一段資料之後進行休眠,以模擬實際業務處理所需要的時間。

服務端**

#include

"lib/common.h"

void

read_data

(int sockfd)

}int

main

(int argc,

char

**ar**)

}

客戶端**

#include

"lib/common.h"

#define message_size 102400

void

send_data

(int sockfd)

query[message_size]

='\0'

;const

char

*cp;

cp = query;

size_t remaining =

strlen

(query)

;while

(remaining)

remaining -

= n_written;

cp +

= n_written;

}return;}

intmain

(int argc,

char

**ar**)

send_data

(sockfd)

;exit(0);}

程式結果:

1、客戶端程式傳送了乙個很大的位元組流,服務端不斷地在螢幕上列印出讀取位元組流,而客戶端直到最後所有的位元組流傳送完畢才列印出下面的一句話,說明在此之前 send 函式一直都是阻塞的,也就是說阻塞式套接字最終傳送返回的實際寫入位元組數和請求位元組數是相等的。

2、服務端處理變慢

傳送成功僅僅表示的是資料被拷貝到了傳送緩衝區中,並不意味著連線對端已經收到所有的資料。至於什麼時候傳送到對端的接收緩衝區,或者更進一步說,什麼時候被對方應用程式緩衝所接收,對我們而言完全都是透明的。

總結:對於 send 來說,返回成功僅僅表示資料寫到傳送緩衝區成功,並不表示對端已經成功收到。

對於 read 來說,需要迴圈讀取資料,並且需要考慮 eof 等異常條件。

問題:一段資料流從應用程式傳送端,一直到應用程式接收端,總共經過了多少次拷貝?

套接字是什麼意思 05 使用套接字進行讀寫

連線建立的根本目的是為了資料的收發。拿我們常用的網購場景舉例子,我們在瀏覽商品或者購買貨品的時候,並不會察覺到網路連線的存在,但是我們可以真切感覺到資料在客戶端和伺服器端有效的傳送,比如瀏覽商品時商品資訊的不斷重新整理,購買貨品時顯示購買成功的訊息等。首先來看一下傳送資料 傳送資料時常用的有三個函式...

使用windows套接字進行網路程式設計

winsock通過提供基於標準可互操作性,使使程式設計師得以採用更高層次的協議和應用程式,比如ftp http rpc和com。winsock是在windows進行網路通訊程式設計的api介面,也是windws網路程式設計的事實標準。在網路程式設計中最常用的方案便是客戶機 伺服器模型。winsock...

使用UNIX域函式進行套接字程式設計

linux網路程式設計 第11章高階套接字,本章介紹高階套接字的程式設計,包含unix域的函式 廣播 多播 資料鏈路層的程式設計等在linux網路程式設計中比較常用的方法。本節為大家介紹使用unix域函式進行套接字程式設計。ad 11.1.3 使用unix域函式進行套接字程式設計 使用unix域函式...