08 TCP套接字之通訊

2021-09-11 03:16:51 字數 2228 閱讀 1763

前面介紹了與套接字相關的函式, 本節就來運用這些函式實現乙個簡單的網路通訊吧.

回射思路

回射, 將客戶端傳送過來的所有資料全部原封不動的傳送回去. 可以使用writeread函式來實現, 客戶端使用write函式向套接字中寫資料, 對端用read函式讀資料並呼叫write函式又將資料寫回套接字, 客戶端最後使用read讀即可.

recv和send函式

回射可以用上面分析到的readwrite函式, 也可以使用recvsend函式實現.

函式原型

#include

intrecv

(int sockfd,

void

*buf, size_t nbytes,

int flags)

;int

send

(int sockfd,

const

void

*buf, size_t nbytes,

int flags)

;

成功 : 返回讀/寫的位元組數

失敗 : 返回-1.

recv跟read功能基本一樣, 前者只支援套接字並多了乙個flags選項, 通常都設定為0.

send跟write功能基本一樣, 前者只支援套接字並多了乙個flags選項, 通常都設定為0.

深度理解

send的功能是拷貝指定長度的資料到傳送緩衝區,只有當資料被全部拷貝完成後函式才會正確返回, 否則進入阻塞狀態或等待超時.

recv的功能是從接收緩衝區讀取(其實就是拷貝)指定長度的資料.如果將接收緩衝區大小設為0, recv將直接從協議緩衝區(滑動視窗區)讀取資料.

函式flags引數

flags值

描述msg_oob傳送或接收外來資料(緊急資料)

msg_dontroute

繞過路由表查詢

msg_dontwait

僅操作非阻塞

msg_peek

窺看外來資料

msg_waitall等待達到nbytes位元組數後才返回

msg_nosignal

往讀端關閉的管道或者socket中寫資料不產生sigpipe訊號

回射實現

先看服務端完整** 1.0_service.c

#include

#include

#include

#include

#include

#define exit(msg) dowhile(0)

intmain

(int argc,

char

*ar**)

exit

(exit_success)

;}

再來看客戶端完整的**1.0_client.c

#include

#include

#include

#include

#define exit(msg) do while(0)

intmain

(int argc,

char

*ar**)

exit

(exit_success)

;}

編譯執行

問題現在我們完成的簡單的socket程式設計, 但是有很多的不足, 如: 只能夠連線乙個客戶端; 服務端關閉客戶端並沒有退出等等. 接下來準備用幾篇文張來實現乙個正確的客戶端/服務端.

總結

基於tcp協議通訊的套接字

以打 舉例 import socket 1.買手機 phone socket.socket socket.af inet,socket.sock stream sock steam tcp流式協議,2.撥號 phone.connect 127.0.0.1 8080 3.發 收訊息 phone.sen...

套接字通訊

利用三元組 ip位址,協議,埠 就可以標識網路的程序 socket即是一種特殊的檔案,一些socket函式就是對其進行的操作 讀 寫io 開啟 關閉 socket是 open write read close 模式的一種實現,那麼socket就提供了這些操作對應的函式介面 tcp通訊中的socket...

套接字通訊

套接字家族的名字 af unix unix一切皆檔案,基於檔案的套接字呼叫的就是底層的檔案系統來取資料,兩個套接字程序執行在同一機器,可以通過訪問同乙個檔案系統間接完成通訊 套接字家族的名字 af inet 還有af inet6被用於ipv6,還有一些其他的位址家族,不過,他們要麼是只用於某個平台,...