socket資料的接收和傳送

2021-07-12 07:04:43 字數 1115 閱讀 9394

linux 不區分套接字檔案和普通檔案,使用 write() 可以向套接字中寫入資料,使用 read() 可以從套接字中讀取資料。

前面我們說過,兩台計算機之間的通訊相當於兩個套接字之間的通訊,在伺服器端用 write() 向套接字寫入資料,客戶端就能收到,然後再使用 read() 從套接字中讀取出來,就完成了一次通訊。

write() 的原型為:

ssize_t write(int fd, const void *buf, size_t nbytes);
fd 為要寫入的檔案的描述符,buf 為要寫入的資料的緩衝區位址,nbytes 為要寫入的資料的位元組數。
size_t 是通過 typedef 宣告的 unsigned int 型別;ssize_t 在 "size_t" 前面加了乙個"s",代表 signed,即 ssize_t 是通過 typedef 宣告的 signed int 型別。
write() 函式會將緩衝區 buf 中的 nbytes 個位元組寫入檔案 fd,成功則返回寫入的位元組數,失敗則返回 -1。

read() 的原型為:

ssize_t read(int fd, void *buf, size_t nbytes);
fd 為要讀取的檔案的描述符,buf 為要接收資料的緩衝區位址,nbytes 為要讀取的資料的位元組數。

read() 函式會從 fd 檔案中讀取 nbytes 個位元組並儲存到緩衝區 buf,成功則返回讀取到的位元組數(但遇到檔案結尾則返回0),失敗則返回 -1。windows 和 linux 不同,windows 區分普通檔案和套接字,並定義了專門的接收和傳送的函式。

從伺服器端傳送資料使用 send() 函式,它的原型為:

int send(socket sock, const char *buf, int len, int flags);
sock 為要傳送資料的套接字,buf 為要傳送的資料的緩衝區位址,len 為要傳送的資料的位元組數,flags 為傳送資料時的選項。

返回值和前三個引數不再贅述,最後的 flags 引數一般設定為 0 或 null,初學者不必深究。

在客戶端接收資料使用 recv() 函式,它的原型為:

int recv(socket sock, char *buf, int len, int flags);

socket傳送和接收資料

1 sendbuf sendtext sendstream 幾乎所有的通訊控制項都會提供上面的3個方法。首先看看sendbuf function tcustomwinsocket.sendbuf var buf count integer integer varerrorcode integer b...

非同步 SOCKET 程式設計 傳送和接收資料

我本想把傳送和接收分開作為兩部分,但是最後我決定只略微解釋一下 fd read 留下更多的時間來說明更複雜的 fd write fd read 事件非常容易掌握.當有資料傳送過來時,winsock 會以 fd read 事件通知你,對於每乙個 fd read 事件,你需要像下面這樣呼叫 recv i...

非同步SOCKET程式設計 傳送和接收資料

基 本上就是這樣,別忘了修改上面的wparam.還有,不一定每一次呼叫recv 都會接收到乙個完整的資料報,因為資料可能不會一次性全部傳送過來.所 以在開始處理接收到的資料之前,最好對接收到的位元組數 即recv 的返回值 進行判斷,看看是否收到的是乙個完整的資料報.fd write相對來說就麻煩一...