色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

bind系統(tǒng)調(diào)用背后的端口管理復(fù)用

麥辣雞腿堡 ? 來源:技術(shù)簡(jiǎn)說 ? 作者:董旭 ? 2023-07-31 10:45 ? 次閱讀

很久之前寫過以上:套接字socket的底層來龍去脈、sockfs文件系統(tǒng)的實(shí)現(xiàn),可以作為本文的前置知識(shí)進(jìn)行學(xué)習(xí)瀏覽。

先來一張本文中核心的一張圖,具體可以看后面文章的解釋:

圖片

本文從socket的bind系統(tǒng)調(diào)用進(jìn)行分析,主要是了解一下bind背后,Linux內(nèi)核是如何進(jìn)行端口綁定、如何管理本地眾多的端口號(hào)。

先直觀感受bind系統(tǒng)調(diào)用背后的端口管理、端口復(fù)用

#include < stdio.h >
#include < stdlib.h >
#include < string.h >
#include < unistd.h >
#include < sys/socket.h >
#include < netinet/in.h >
#include < arpa/inet.h >
 
int main(int argc, char *argv[])
{
    int sockfd_one;
    int err_log;
    sockfd_one = socket(AF_INET, SOCK_STREAM, 0); //創(chuàng)建TCP套接字one
    if(sockfd_one < 0)
    {
    perror("sockfd_one");
    exit(-1);
    }
 
    // 設(shè)置本地網(wǎng)絡(luò)信息
    struct sockaddr_in my_addr;
    bzero(&my_addr, sizeof(my_addr));
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(8000);        // 端口為8000
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
 
    // 綁定,端口為8000
    err_log = bind(sockfd_one, (struct sockaddr*)&my_addr, sizeof(my_addr));
    if(err_log != 0)
    {
        perror("bind sockfd_one");
        close(sockfd_one);        
        exit(-1);
    }
 
    int sockfd_two;
    sockfd_two = socket(AF_INET, SOCK_STREAM, 0);  //創(chuàng)建TCP套接字two
    if(sockfd_two < 0)
    {
        perror("sockfd_two");
        exit(-1);
    }
 
    // 新套接字sockfd_two,繼續(xù)綁定8000端口,綁定失敗
    // 因?yàn)?000端口已被占用,默認(rèn)情況下,端口沒有釋放,無法綁定
    err_log = bind(sockfd_two, (struct sockaddr*)&my_addr, sizeof(my_addr));
    if(err_log != 0)
    {
        perror("bind sockfd_two");
        close(sockfd_two);        
        exit(-1);
    }
 
    close(sockfd_one);
    close(sockfd_two);
 
    return 0;
}

圖片

可以看到端口重復(fù)綁定導(dǎo)致了第二個(gè)套接字創(chuàng)建失敗,我們通過setsockopt系統(tǒng)調(diào)用在創(chuàng)建socket后設(shè)置端口可復(fù)用:

int opt = 1;
// sockfd為需要端口復(fù)用的套接字
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const void *)&opt, sizeof(opt));

具體如下:

#include < stdio.h >
#include < stdlib.h >
#include < string.h >
#include < unistd.h >
#include < sys/socket.h >
#include < netinet/in.h >
#include < arpa/inet.h >
 
int main(int argc, char *argv[])
{
    int sockfd_one;
    int err_log;
    sockfd_one = socket(AF_INET, SOCK_STREAM, 0); //創(chuàng)建UDP套接字one
    if(sockfd_one < 0)
    {
    perror("sockfd_one");
    exit(-1);
    }
 
    // 設(shè)置本地網(wǎng)絡(luò)信息
    struct sockaddr_in my_addr;
    bzero(&my_addr, sizeof(my_addr));
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(8000);        // 端口為8000
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    
    // 在sockfd_one綁定bind之前,設(shè)置其端口復(fù)用
    int opt = 1;
    setsockopt( sockfd_one, SOL_SOCKET,SO_REUSEADDR, 
                    (const void *)&opt, sizeof(opt) );
 
    // 綁定,端口為8000
    err_log = bind(sockfd_one, (struct sockaddr*)&my_addr, sizeof(my_addr));
    if(err_log != 0)
    {
        perror("bind sockfd_one");
        close(sockfd_one);        
        exit(-1);
    }
 
    int sockfd_two;
    sockfd_two = socket(AF_INET, SOCK_STREAM, 0);  //創(chuàng)建UDP套接字two
    if(sockfd_two < 0)
    {
        perror("sockfd_two");
        exit(-1);
    }
 
    // 在sockfd_two綁定bind之前,設(shè)置其端口復(fù)用
    opt = 1;
    setsockopt( sockfd_two, SOL_SOCKET,SO_REUSEADDR, 
                    (const void *)&opt, sizeof(opt) );
    
    // 新套接字sockfd_two,繼續(xù)綁定8000端口,成功
    err_log = bind(sockfd_two, (struct sockaddr*)&my_addr, sizeof(my_addr));
    if(err_log != 0)
    {
        perror("bind sockfd_two");
        close(sockfd_two);        
        exit(-1);
    }
    printf("two socket create success!n");
    close(sockfd_one);
    close(sockfd_two);
 
    return 0;
}

圖片

如上,兩個(gè)套接字綁定同一個(gè)端口都創(chuàng)建成功。下面將從bind出發(fā)分析bind是如何端口管理、復(fù)用的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1372

    瀏覽量

    40282
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11296

    瀏覽量

    209348
  • 系統(tǒng)
    +關(guān)注

    關(guān)注

    1

    文章

    1015

    瀏覽量

    21332
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    從Linux源碼分析bind系統(tǒng)調(diào)用

    眾所周知,一個(gè)Server端Socket的建立,需要socket、bind、listen、accept四個(gè)步驟。
    的頭像 發(fā)表于 10-16 11:08 ?3286次閱讀
    從Linux源碼分析<b class='flag-5'>bind</b><b class='flag-5'>系統(tǒng)</b><b class='flag-5'>調(diào)用</b>

    udp_bind這個(gè)綁定的端口怎么解除?

    請(qǐng)教下,udp_bind 這個(gè)綁定的端口,剛開始是可以的,但是重新綁定時(shí)返回錯(cuò)誤,有什么方法可以在 重新綁定前解除之前的綁定 ?
    發(fā)表于 04-22 07:41

    TCP server 不能 bind 80 端口

    后程序只開一個(gè) AP 模式下的 TCP server ,測(cè)試。 ?但是發(fā)現(xiàn) 80 端口沒法 bind ,錯(cuò)誤碼是 -98 ,意思是端口已被占用? 換一個(gè)其它端口號(hào)(比如 12345)就
    發(fā)表于 05-14 00:33

    如何去使用STM32的端口復(fù)用

    STM32的端口復(fù)用映射原理是什么?如何去使用STM32的端口復(fù)用呢?
    發(fā)表于 11-01 06:45

    端口復(fù)用映射原理及GPIO外設(shè)復(fù)用功能配置過程

    文章目錄端口復(fù)用端口復(fù)用映射原理原理示意圖映射配置系統(tǒng)功能GPIO外設(shè)復(fù)用功能配置過程GPIO
    發(fā)表于 12-09 07:20

    STM32的端口復(fù)用映射原理是什么

    STM32的端口復(fù)用映射原理是什么?STM32的端口復(fù)用配置過程是怎樣的?
    發(fā)表于 12-15 07:03

    什么叫端口復(fù)用?如何配置端口

    端口復(fù)用和重映射什么叫端口復(fù)用?一個(gè)引腳既能當(dāng)IO用又有其他的第二功能那么如何配置端口呢?1.IO口使能2.
    發(fā)表于 01-11 08:12

    端口復(fù)用概念

    記錄一下,方便以后翻閱~主要內(nèi)容:1)端口復(fù)用;2)端口重映射;官方資料:《STM32中文參考手冊(cè)V10》第8章 通用和復(fù)用功能IO(GPIO和AFIO)1.
    發(fā)表于 01-11 07:43

    Bind源代碼包安裝

    先到官方下載Bind的安裝包 wgetftp://ftp.isc.org/isc/bind9/9.6.0-P1/bind-9.6.0-P1.tar.gz tar xzvf
    發(fā)表于 04-04 20:30 ?23次下載

    STM32單片機(jī)端口復(fù)用端口重映射

    STM32單片機(jī)端口復(fù)用端口重映射STM32單片機(jī)上有很多I/O口,也有很多的內(nèi)置外設(shè),比如I2C、ADC、DAC、USART等都屬于內(nèi)置外設(shè)。這些內(nèi)置外設(shè)基本都是與I/O口共用管腳的,也就是I
    發(fā)表于 12-28 19:23 ?8次下載
    STM32單片機(jī)<b class='flag-5'>端口</b><b class='flag-5'>復(fù)用</b>和<b class='flag-5'>端口</b>重映射

    STM32學(xué)習(xí)筆記--端口復(fù)用&重映射

    目錄:一、端口復(fù)用二、端口重映射一、端口復(fù)用? STM32 有很多的內(nèi)置外設(shè),這些外設(shè)的外部引腳都是與 GPIO
    發(fā)表于 12-28 19:35 ?14次下載
    STM32學(xué)習(xí)筆記--<b class='flag-5'>端口</b><b class='flag-5'>復(fù)用</b>&重映射

    什么是bind?你真的熟悉bind嗎?

    bind()方法創(chuàng)建一個(gè)新的函數(shù),在bind()被調(diào)用時(shí),這個(gè)新函數(shù)的this被指定 bind()的第一個(gè)參數(shù),而其余參數(shù)將作為新函數(shù)的參數(shù),供調(diào)用
    的頭像 發(fā)表于 07-13 09:56 ?2764次閱讀

    網(wǎng)絡(luò)系統(tǒng)調(diào)用網(wǎng)絡(luò)套接字入口函數(shù)

    網(wǎng)絡(luò)套接字入口函數(shù) //所有的網(wǎng)絡(luò)套接字系統(tǒng)調(diào)用函數(shù)(socket bind listen connect )都使用一個(gè)共同的入口函數(shù):sys_socketcall /* 第一個(gè)參數(shù)call表示被
    的頭像 發(fā)表于 07-24 11:02 ?470次閱讀

    Linux bind的核心執(zhí)行函數(shù)

    bind的核心執(zhí)行函數(shù) bind系統(tǒng)調(diào)用的核心函數(shù)調(diào)用流程如下: SYSCALL_DEFINE3( bi
    的頭像 發(fā)表于 07-31 10:51 ?571次閱讀

    Linux內(nèi)核分析 bind端口選擇

    bind 傳 遞的地址參數(shù)中,port 字段為 0,那么就會(huì)自動(dòng)選擇參數(shù)。 如代碼所示,當(dāng)端口port沒有指定時(shí),調(diào)用inet_csk_find_open_port(sk, port): if (!port) { head
    的頭像 發(fā)表于 07-31 11:08 ?955次閱讀
    主站蜘蛛池模板: 久久99视频免费| 日韩一区二区三区射精| 在线观看视频亚洲| 久久re热在线视频精69| 野花韩国中文版免费观看| 久久www成人看片| 在线观看国产视频| 两性午夜色视频免费网站| 116美女写真成人午夜视频| 麻豆精品一卡2卡三卡4卡免费观看| 中文字幕1| 男总裁憋尿PLAY灌尿BL| xxxxx俄罗斯| 日日夜夜噜噜| 国产精品亚洲欧美| 亚洲裸舞 hd| 久久久免费观看| 97色伦图片7778久久| 欧美又粗又长又大AAAA片| 哒哒哒影院在线观看免费高清| 十九岁韩国电影在线观看| 国产探花在线精品一区二区| 亚洲性夜夜色综合网站| 久久青草免费91线频观看站街| 97国产在线播放| 日韩精品特黄毛片免费看| 国产精品99久久免费黑人人妻| 无人视频在线观看免费播放影院| 国产主播福利一区二区| 在线二区 中文 无码| 欧美人妇无码精品久久| 高h 大尺度纯肉 np快穿| 亚洲第一页视频| 快播官方网站| 超碰caoporn| 亚洲 欧美 中文字幕 在线| 久久久国产精品免费A片蜜芽广| 99热在线精品免费全部my| 四虎影视库永久免费| 精品 在线 视频 亚洲| 99re这里只有精品国产|