做專案經查遇到socket(套接字)的地方,業務的地方大部分直接呼叫介面,讀取到內容後再返回給介面就ok了,但學習要深究其原理,因此決定學習下socket相關的內容,該文章參考了下面這位大佬的文章,不做搬運工,寫下自己的理解;
linux上通訊和通訊協議tcp中的三次握手沒有直接聯絡,學習學的三次握手和四次握手釋放都是很底層的東西,linux程式設計提供了socket.h 的標頭檔案,裡面有封裝好的服務端和客戶端的介面,介面類似於下的
extern int socket (int __domain, int __type, int __protocol) __throw; 建立
extern int bind (int __fd, __const_sockaddr_arg __addr, socklen_t __len) __throw; 繫結ip 埠
extern int connect (int __fd, __const_sockaddr_arg __addr, socklen_t __len); 連線
extern ssize_t send (int __fd, const void *__buf, size_t __n, int __flags); 傳送
extern ssize_t recv (int __fd, void *__buf, size_t __n, int __flags); 接收
extern int listen (int __fd, int __n) __throw; 監聽
extern int accept (int __fd, __sockaddr_arg __addr,socklen_t *__restrict __addr_len); 接收
extern int shutdown (int __fd, int __how) __throw; 關閉連線
socket.h標頭檔案在linux系統下都有 很多種
root[/usr]%find . | grep socket.h
./include/asm/socket.h
./include/asm-generic/socket.h
./include/linux/caif/caif_socket.h
./include/linux/netfilter/xt_socket.h
./include/linux/socket.h
./include/bits/socket.h
./include/sys/socket.h
./src/kernels/3.10.0-957.21.3.el7.x86_64.debug/arch/x86/include/uapi/asm/socket.h
./src/kernels/3.10.0-957.21.3.el7.x86_64.debug/include/config/ieee802154/socket.h
./src/kernels/3.10.0-957.21.3.el7.x86_64.debug/include/config/netfilter/xt/match/socket.h
./src/kernels/3.10.0-957.21.3.el7.x86_64.debug/include/linux/socket.h
./src/kernels/3.10.0-957.21.3.el7.x86_64.debug/include/uapi/asm-generic/socket.h
./src/kernels/3.10.0-957.21.3.el7.x86_64.debug/include/uapi/linux/caif/caif_socket.h
./src/kernels/3.10.0-957.21.3.el7.x86_64.debug/include/uapi/linux/netfilter/xt_socket.h
./src/kernels/3.10.0-957.21.3.el7.x86_64.debug/include/uapi/linux/socket.h
在服務端要用先呼叫socket、bind、listen後,迴圈中等待 accpt recv 等
在客戶端 依次是socket 、 connect、send 等
下面是我測試的**
服務端:
#include#include#include#include#include#include#include#include#define maxline 4096
int main(int argc, char** ar**)
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = af_inet;
servaddr.sin_addr.s_addr = htonl(inaddr_any);
servaddr.sin_port = htons(6666);
//呼叫函式bind() 繫結ip 埠
if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
// 呼叫listen()函式 準備接受客戶端
if( listen(listenfd, 10) == -1)
printf("*****=waiting for client's request*****=\n");
while(1)
// 呼叫recv 函式獲取內容
n = recv(connfd, buff, maxline, 0);
buff[n] = '\0';
printf("recv msg from client: %s\n", buff);
for (int i = 0; i 客戶端:
#include#include#include#include#include#include#include#define maxline 4096
int main(int argc, char** ar**)
if( (sockfd = socket(af_inet, sock_stream, 0)) < 0)
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = af_inet;
servaddr.sin_port = htons(6666);
if( inet_pton(af_inet, ar**[1], &servaddr.sin_addr) <= 0)
if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
printf("send msg to server: \n");
fgets(sendline, 4096, stdin);
if( send(sockfd, sendline, strlen(sendline), 0) < 0)
if (recv(sockfd, recvline, strlen(sendline), 0) < 0)
printf("recv msg from server: %s\n",recvline);
close(sockfd);
exit(0);
}
至於將的協議 其他之類 暫時不熟悉 不表。 初學socket程式設計(網路程式設計)
tcp 是面向連線的,三次握手成功之後才能通訊,位元組流傳輸,效率低於udp,但是安全性高 因為採用了三次握手和四次揮手協議 雙方需要建立連線才能通訊 傳送資料 底層使用tcp協議,tcp底層是用http協議。tcp三次握手四次揮手示意圖 tcp通訊實現 先建立伺服器端 tcp協議服務端 publi...
socket網路程式設計的初學使用見解
所謂socket通常也稱作 套接字 應用程式通常通過 套接字 向網路發出請求或者應答網路請求。根據連線啟動的方式以及本地 套接字要連線的目標,套接字之間的連線過程可以分為三個步驟 伺服器監聽,客戶端請求,連線確認。伺服器監聽 是 伺服器端 套接字並不定位具體的 客戶端套接字,而是處於等待連線的狀態,...
Socket初學認識 Socket模型
socket實際上代表的是網路通訊的乙個端點,通過socket,使用者所開發的應用程式可以通過網路和其他socket應用程式通訊。socket是網路的i o基礎,也可以將它與unix的管道或者檔案模擬。應用程式需要與遠端主機連線時,應建立乙個socket,之後通過socket與遠端應用程式建立連線,...