C语言网络编程:listen函数详解
生活随笔
收集整理的這篇文章主要介紹了
C语言网络编程:listen函数详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 前言
- 函數描述
- 代碼實例
- TCP服務器為什么調用listen
前言
根據TCP編程模型中我們可以看到之前的socket和bind接口是tcp服務器在為接收客戶端的鏈接做準備,保證tcp的面向字節流,面向連接的可靠通信服務正常進行。接下來的listen端口則為我們進行三次握手與客戶端進行鏈接的接口。
TCP編程模型如下
函數描述
#include <sys/socket.h>int listen(int sockfd, int backlog);- 函數功能:將套接字文件描述符從主動轉為被動文件描述符,然后用于被動監聽客戶端的連接
- 函數返回值:成功返回0,失敗返回-1, errno被設置
- 參數:
a.sockfd表示socket創建的套接字文件描述符
b.backlog指定隊列的容量
這個隊列用于記錄正在連接但是還沒有連接完成的客戶端,一般設置隊列的容量為2,3即可。隊列的最大容量需要小于30
代碼實例
#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; //設置tcp協議族addr.sin_port = 6789; //設置端口號addr.sin_addr.s_addr = inet_addr("192.168.102.169"); //設置ip地址ret = bind(skfd, (struct sockaddr*)&addr, sizeof(addr));if ( -1 == ret) {print_err("bind failed",__LINE__,errno);}/*將套接字文件描述符從主動轉為被動文件描述符,然后用于被動監聽客戶端的連接*/ret = listen(skfd, 3);if ( -1 == ret ) {print_err("listen failed", __LINE__, errno);}return 0;
}
TCP服務器為什么調用listen
因為連接請求只能由客戶端發起,此時服務端的listen函數是將服務端的主動描述符轉為被動描述符,否則無法用于監聽客戶端的連接。
TCP服務器監聽客戶端鏈接時,使用的是socket返回的“套接字文件描述符”來實現的,但是這個文件描述符默認是主動文件描述符(主動向對方發送數據),所以需要使用listen函數將其轉換為被動描述符(只能被動得等待別人主動發送數據,再回應),否則無法用于被動監聽客戶端。
總結
以上是生活随笔為你收集整理的C语言网络编程:listen函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英诺森十世是谁画的啊?
- 下一篇: C语言网络编程:bind函数详解