前面介紹了與套接字相關的函式, 本節就來運用這些函式實現乙個簡單的網路通訊吧.
回射思路
回射, 將客戶端傳送過來的所有資料全部原封不動的傳送回去. 可以使用write
和read
函式來實現, 客戶端使用write函式向套接字中寫資料, 對端用read函式讀資料並呼叫write函式又將資料寫回套接字, 客戶端最後使用read讀即可.
recv和send函式
回射可以用上面分析到的read
和write
函式, 也可以使用recv
和send
函式實現.
函式原型
#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,還有一些其他的位址家族,不過,他們要麼是只用於某個平台,...