初學socket程式設計

2021-10-06 11:41:23 字數 3702 閱讀 2684

做專案經查遇到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與遠端應用程式建立連線,...