日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C语言网络编程:listen函数详解

發布時間:2023/11/27 生活经验 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言网络编程:listen函数详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

          • 前言
          • 函數描述
          • 代碼實例
          • TCP服務器為什么調用listen

前言

根據TCP編程模型中我們可以看到之前的socketbind接口是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函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。