通過socket進行網絡通信(服務端)

聲明:此文只是爲自己方便理解,做了一些具象的比喻和假設,並不符合客觀事實,謹慎閱讀!

​ 在一臺主機中, 兩個進程想要通信可以通過一個管道(文件):一個從管道的一端寫,一個從另一端讀 , 然而管道是半雙工的 , 如果一個進程既想讀又想寫 , 那就創建兩個管道。利用socket進行網絡通信的過程與之類似:將對方主機抽象成一個全雙工管道文件,爲其創建文件描述符,對這個文件描述符進行讀寫。

創建監聽套接字

int listen_fd = socket(AF_INET, SOCK_STREAM, 0);

​ 創建監聽套接字的目的是監聽是否有客戶端連接該主機,但只有一個文件描述符客戶端是找不到的,客戶端是通過IP地址和端口找到需要通信的進程的,所以要將該listen_fd與IP地址和端口綁定,方便起見,將IP與端口定義成一個結構體。

監聽套接字與端口綁定

// 先初始化IP + 端口 這個結構體
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
// 設置端口
server_addr.sin_port = htons(8080);
// 設置ip
inet_pton(AF_INET, "192.xx.xxx.xx", &server_addr.sin_addr.s_addr);
// 將監聽套接字與 ip+端口綁定
bind(listen_fd, (struct sockaddr*)&server_addr, sizeof(addr));

​ 現在網絡上已經有一個“管道”通向服務器,其他主機想要通信並不是直接寫這個“管道”,而是通過該“管道”再申請一個專門通信的“管道”。原因很簡單,一個服務大衆的人民公園不可能只設一個大門。於是,主機通過listen_fd監聽到有人來通信,就新創建一個“管道”來通信。就好像住酒店,要先在前臺(listen_fd)訂房間(client_fd),然後房間(client_fd)裏睡覺,而不能在前臺(listen_fd)睡覺。

監聽並接受一個新客戶

listen(listen_fd);
// 此時有用戶連接
//client_addr接受客戶的地址信息:IP + 端口
struct sockaddr_in client_addr;
int client_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &len);

讀寫,關閉

​ 此時就可以對client_fd進行讀寫;

char buf[1024];
read(client_fd,buf,sizeof(buf));

write(client_fd, buf, sizeof(buf));

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