關於socket編程的簡單認識

面試的時候面試官問到“請問你是否瞭解socket編程?”
說實話,我是知道一些函數的,但是具體的實現我不瞭解,並且工作中也基本上沒用到。所以我回答了“不是很瞭解,只是校招的時候知道一些函數”,現在想想,還是自己學習的不夠系統,漏洞百出啊。

今天,簡簡單單學習下socket編程。

1.什麼是socket編程?
socket是一種網絡通信的技術。
上一篇博客複習了三次握手和四次揮手,但是沒有複習到五大層及其所擁有的一些常見的協議。現在舉例說明幾個協議。

層級 協議
應用層 HTTP/FTP/DNS/SMTP
傳輸層 TCP/UDP
網絡層 IP/ICMP/ARP
數據鏈路層 ARP/RARP
物理層

五層架構展示完了,此時,就想socket通信,是在哪一層上或者哪一層和哪一層之間呢。
博客
處摘要了該博主一張很生動的結構圖:
在這裏插入圖片描述

很明顯,socket通信位於應用層和傳輸層之間。流程大致爲:傳輸層爲socket層提供服務,socket層再爲應用層提供服務。之前複習過了TCP三次握手,socket通信也是通過類似三次握手的形式實現的通信,現在直接看socket層是如何實現的吧。仍然是從上面博主的博客中得到這樣一張簡明扼要的結構圖
在這裏插入圖片描述
這個三次握手的過程實質上時已經創建了socket通道之後的數據傳輸的過程,在這之前我們需要創建socket,並且利用socket中提供的方法來實現客戶端和服務器之間的通信。
流程圖:來自於博客
在這裏插入圖片描述
在這裏插入圖片描述
看一下socket各個函數的功能及使用。
//不要忘記包含頭文件
1.socket()函數

#include <WinSock2.h>
/*
param domain 協議族,如AF_INET,AF_INET6等
param type   指定socket(套接口)類型,如SOCK_STREAM,SOCK_DGRAM
param protocol 指定協議(一般爲0,根據type有默認值),如IPPROTO_TCP,IPPROTO_UDP等
*/
int socket(int domain, int type, int protocol);

2.bind函數

#include <WinSock2.h>
/*
sockfd 		socket()函數的返回值
address 	指向特定協議的地址結構指針
addLen 		address所指向的結構體的長度
*/

int bind(int sockfd, const struct sockaddr* address, socklen_t addLen);

3.listen()函數
該函數只在TCP服務器中使用,和客戶端無關。

#include <WinSock2.h>
/*
sockfd		當前創建的套接口的標識
backlog		後臺等待連續隊列的最大限制值
*/

int listen(int sockfd, int backlog);

4.connect()函數
該函數有客戶端調用,和服務器建立連接

#include <WinSock2.h>
/*
sockfd		客戶端創建的套接口標識
addr		指向套接口地址結構的指針
addrlen 	addr指向結構體的大小
*/
int connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen);

5.accept()函數
該函數由TCP服務器調用

#include <WinSock2.h>
/*
sockfd		服務器	創建的套接口標識
addr		返回客戶端的協議地址
addrlen 	協議地址的長度
*/

int accept(int sockfd, struct sockaddr* addr, socklen_t* addrlen);

6.close()函數
close函數用於關閉套接口,服務器端和客戶端均調用。

#include <WinSock2.h>
//sockfd	套接口的標識
int close(int sockfd);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章