C语言网络编程:listen函数详解
生活随笔
收集整理的這篇文章主要介紹了
C语言网络编程:listen函数详解
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 前言
- 函數(shù)描述
- 代碼實(shí)例
- TCP服務(wù)器為什么調(diào)用listen
前言
根據(jù)TCP編程模型中我們可以看到之前的socket和bind接口是tcp服務(wù)器在為接收客戶端的鏈接做準(zhǔn)備,保證tcp的面向字節(jié)流,面向連接的可靠通信服務(wù)正常進(jìn)行。接下來的listen端口則為我們進(jìn)行三次握手與客戶端進(jìn)行鏈接的接口。
TCP編程模型如下
函數(shù)描述
#include <sys/socket.h>int listen(int sockfd, int backlog);- 函數(shù)功能:將套接字文件描述符從主動(dòng)轉(zhuǎn)為被動(dòng)文件描述符,然后用于被動(dòng)監(jiān)聽客戶端的連接
- 函數(shù)返回值:成功返回0,失敗返回-1, errno被設(shè)置
- 參數(shù):
a.sockfd表示socket創(chuàng)建的套接字文件描述符
b.backlog指定隊(duì)列的容量
這個(gè)隊(duì)列用于記錄正在連接但是還沒有連接完成的客戶端,一般設(shè)置隊(duì)列的容量為2,3即可。隊(duì)列的最大容量需要小于30
代碼實(shí)例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <errno.h>void print_err(char *str, int line, int err_no) {printf("%d, %s :%s\n",line,str,strerror(err_no));_exit(-1);
}int main()
{int skfd = -1, ret = -1;skfd = socket(AF_INET, SOCK_STREAM, 0);if ( -1 == skfd) {print_err("socket failed",__LINE__,errno);}struct sockaddr_in addr;addr.sin_family = AF_INET; //設(shè)置tcp協(xié)議族addr.sin_port = 6789; //設(shè)置端口號(hào)addr.sin_addr.s_addr = inet_addr("192.168.102.169"); //設(shè)置ip地址ret = bind(skfd, (struct sockaddr*)&addr, sizeof(addr));if ( -1 == ret) {print_err("bind failed",__LINE__,errno);}/*將套接字文件描述符從主動(dòng)轉(zhuǎn)為被動(dòng)文件描述符,然后用于被動(dòng)監(jiān)聽客戶端的連接*/ret = listen(skfd, 3);if ( -1 == ret ) {print_err("listen failed", __LINE__, errno);}return 0;
}
TCP服務(wù)器為什么調(diào)用listen
因?yàn)檫B接請(qǐng)求只能由客戶端發(fā)起,此時(shí)服務(wù)端的listen函數(shù)是將服務(wù)端的主動(dòng)描述符轉(zhuǎn)為被動(dòng)描述符,否則無法用于監(jiān)聽客戶端的連接。
TCP服務(wù)器監(jiān)聽客戶端鏈接時(shí),使用的是socket返回的“套接字文件描述符”來實(shí)現(xiàn)的,但是這個(gè)文件描述符默認(rèn)是主動(dòng)文件描述符(主動(dòng)向?qū)Ψ桨l(fā)送數(shù)據(jù)),所以需要使用listen函數(shù)將其轉(zhuǎn)換為被動(dòng)描述符(只能被動(dòng)得等待別人主動(dòng)發(fā)送數(shù)據(jù),再回應(yīng)),否則無法用于被動(dòng)監(jiān)聽客戶端。
總結(jié)
以上是生活随笔為你收集整理的C语言网络编程:listen函数详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英诺森十世是谁画的啊?
- 下一篇: C语言网络编程:bind函数详解