面試的時候面試官問到“請問你是否瞭解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);
’