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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

socket选项: SO_REUSEADDR, SO_RCVBUF, SO_SNDBUF

發布時間:2023/12/9 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 socket选项: SO_REUSEADDR, SO_RCVBUF, SO_SNDBUF 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

From:?http://blog.csdn.net/jasonliuvip/article/details/22591531

最近在看《linux高性能服務器編程》,在此做個日記,以激勵自己,同時分享于有需要的朋友。


1. 讀取和設置socket文件描述符屬性:

[cpp]?view plaincopy
  • #include?<sys/socket.h>??
  • ??
  • int?getsockopt(int?sockfd,?int?level,?int?option_name,?void?*option_value,?socklen_t?*restrict?option_len);??
  • ??
  • int?setsockopt(int?sockfd,?int?level,?int?option_name,?const?void?*option_value,?socklen_t?option_len);??
  • sockfd參數指定被操作的目標socket。?

    level參數指定要操作哪個協議的選項,即屬性,比如:IPv4, IPv6, TCP 和通用socket選項。

    option_name參數指定選項的名字。

    option_value參數指定選項的值。

    option_len參參數指定選項的長度。

    調用成功時返回0, 失敗時返回-1, 并設置errno。


    2. 對服務器而言,有部分socket選項只能在調用listen前設置才會有效。因為連接socket只能由accept調用返回,而accept從listen監聽隊列中接受的連接至少已經完成了TCP三次握手的前兩個步聚,listen監聽隊列的連接至少已進入SYN_RCVD狀態,這時服務器已經往被連接上發送TCP同步報文。


    3. SO_REUSeADDR選項:重用本地地址

    未設置此項前,若服務端開啟后,又關閉,此時sock處于TIME_WAIT狀態,與之綁定的socket地址不可重用,而導致再次開啟服務端失敗。

    經過setsockopt設置之后, 即使處于TIME_WAIT些狀態也可以立即被重用。

    [cpp]?view plaincopy
  • int?reuse?=?1;??
  • setsockopt(sock,?SOL_SOCKET,?SO_REUSEADDR,?&reuse,?sizof(reuse));??

  • 4. SO_RCVBUF 和 SO_SNDBUF :TCP接收緩沖區和發送緩沖區的大小

    當然,即使我們設置了這兩項的大小時, 系統都會自動將其加倍, 并且不得小于某個最小值。

    TCP接收緩沖區的最小值是 256 字節, 而發送緩沖區的最小值是 2048 字節。(不同系統可能會有差異)

    這么做的目的是確保一個TCP連接擁有足夠多的空閑緩沖區來處理擁塞。

    [java]?view plaincopy
  • setsockopt(sock,?SOL_SOCKET,?SO_SNDBUF,?&sendbuf,?sizeof(sendbuf));??
  • getsockopt(sock,?SOL_SOCKET,?SO_SNDBUF,?&sendbuf,?(socklen_t*)&len);??
  • ??
  • setsockopt(sock,?SOL_SOCKET,?SO_RCVBUF,?&recvbuf,?sizeof(recvbuf));??
  • getsockopt(sock,?SOL_SOCKET,?SO_RCVBUF,?&recvbuf,?(socklen_t*)&len);??



  • 5. 代碼

    [cpp]?view plaincopy
  • //服務端??
  • #include?<stdio.h>??
  • #include?<stdlib.h>??
  • #include?<unistd.h>??
  • #include?<string.h>??
  • #include?<errno.h>??
  • #include?<sys/socket.h>??
  • #include?<arpa/inet.h>??
  • #include?<assert.h>??
  • ??
  • #define?BUFFER_SIZE?1024??
  • ??
  • int?main(int?argc,?char?**argv)??
  • {??
  • ????if?(argc?<=?3)?{??
  • ????????printf("Usage:?%s?ip?port?revc_size\n",?basename(argv[0]));??
  • ????????return?1;??
  • ????}??
  • ??????
  • ????const?char?*ip?=?argv[1];??
  • ????int?port?=?atoi(argv[2]);??
  • ??????
  • ????struct?sockaddr_in?address;??
  • ????bzero(&address,?sizeof(address));??
  • ????address.sin_family?=?AF_INET;??
  • ????address.sin_port?=?htons(port);??
  • ????inet_pton(AF_INET,?ip,?&address.sin_addr);??
  • ??????
  • ????int?sock?=?socket(PF_INET,?SOCK_STREAM,?0);??
  • ????assert(sock?>=?0);??
  • ??
  • ????????//設置地址可重用??
  • ????int?reuse?=?1;??
  • ????setsockopt(sock,?SOL_SOCKET,?SO_REUSEADDR,?&reuse,?sizof(reuse));??
  • ??????
  • ????int?recvbuf?=?atoi(argv[3]);??
  • ????int?len?=?sizeof(recvbuf);??
  • ??????
  • ????????//設置接受緩沖區大小??
  • ????setsockopt(sock,?SOL_SOCKET,?SO_RCVBUF,?&recvbuf,?sizeof(recvbuf));??
  • ????????//獲取系統修改后的大小??
  • ????????getsockopt(sock,?SOL_SOCKET,?SO_RCVBUF,?&recvbuf,?(socklen_t*)&len);??
  • ????printf("the?receive?buffer?size?after?setting?is?%d\n",?recvbuf);??
  • ??????
  • ????int?ret?=?bind(sock,?(struct?sockaddr*)&address,?sizeof(address));??
  • ????assert(ret?!=?-1);??
  • ??????
  • ????ret?=?listen(sock,?5);??
  • ????assert(ret?!=?-1);??
  • ??????
  • ????struct?sockaddr_in?client;??
  • ????socklen_t?client_addrlength?=?sizeof(client);??
  • ??????
  • ????int?connfd?=?accept(sock,?(struct?sockaddr*)&client,?&client_addrlength);??
  • ????if?(connfd?<?0)?{??
  • ????????printf("errno?is:?%d\n",?errno);??
  • ????}??
  • ????else?{??
  • ????????char?buffer[BUFFER_SIZE];??
  • ????????memset(buffer,?'\0',?BUFFER_SIZE);??
  • ??????????
  • ????????while?(recv(connfd,?buffer,?BUFFER_SIZE-1,?0)?>?0);??
  • ??????????
  • ????????printf("recv:?%s\n",?buffer);??
  • ????????close(connfd);??
  • ????}??
  • ??????
  • ????close(sock);??
  • ??????
  • ????return?0;??
  • }??
  • 運行后:

    jason@lightning:~/myproject/test_recv$ ./test_recv localhost 8000 50
    the receive buffer size after setting is 2280

    很明顯被修改過了, 我們給的50, 被改為2280。



    [cpp]?view plaincopy
  • //客戶端??
  • #include?<stdio.h>??
  • #include?<sys/socket.h>??
  • #include?<arpa/inet.h>??
  • #include?<assert.h>??
  • #include?<unistd.h>??
  • #include?<stdlib.h>??
  • #include?<string.h>??
  • ??
  • #define?BUFFER_SIZE?1024??
  • ??
  • int?main(int?argc,?char?**argv)??
  • {??
  • ????if(argc?<=?3)?{??
  • ????????fprintf(stderr,?"Usage:?%s?ip?port?send_buffer_size\n",???
  • ????????????????basename(argv[0]));??
  • ????????return?1;??
  • ????}??
  • ??????
  • ????const?char?*ip?=?argv[1];??
  • ????int?port?=?atoi(argv[2]);??
  • ??????
  • ????struct?sockaddr_in?server_address;??
  • ????bzero(&server_address,?sizeof(server_address));??
  • ????server_address.sin_family?=?AF_INET;??
  • ????server_address.sin_port?=?htons(port);??
  • ????inet_pton(AF_INET,?ip,?&server_address.sin_addr);??
  • ??
  • ????int?sock?=?socket(PF_INET,?SOCK_STREAM,?0);??
  • ????assert(sock?>=?0);??
  • ??????
  • ????int?sendbuf?=?atoi(argv[3]);??
  • ????int?len?=?sizeof(sendbuf);??
  • ??????
  • ????????//設置發送緩沖區大小??
  • ????setsockopt(sock,?SOL_SOCKET,?SO_SNDBUF,?&sendbuf,?sizeof(sendbuf));??
  • ????????//獲取系統修改后的大小??
  • ????????getsockopt(sock,?SOL_SOCKET,?SO_SNDBUF,?&sendbuf,?(socklen_t*)&len);??
  • ??????
  • ????printf("the?tcp?send?buffer?size?after?setting?is?%d\n",??
  • ????????????sendbuf);??
  • ??????
  • ????if?(connect(sock,?(struct?sockaddr*)&server_address,?sizeof(server_address))?!=?-1)?{??
  • ????????char?buffer[BUFFER_SIZE];??
  • ????????memset(buffer,?'a',?BUFFER_SIZE);??
  • ????????send(sock,?buffer,?BUFFER_SIZE,?0);??
  • ????}??
  • ????else?{??
  • ????????printf("connect?%s?failed\n",?ip);??
  • ????}??
  • ??????
  • ????close(sock);??
  • ??????
  • ????return?0;??
  • }??

  • 運行后:

    jason@lightning:~/myproject/test_send$ ./test_send localhost 8000 2000
    the tcp send buffer size after setting is 4000

    給的是2000, 被改成4000了。


    總結

    以上是生活随笔為你收集整理的socket选项: SO_REUSEADDR, SO_RCVBUF, SO_SNDBUF的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 我要看免费黄色片 | 国产乱码精品一区二区三区不卡 | 国产调教av| 婷婷啪啪 | 妓院一钑片免看黄大片 | 九色porn蝌蚪 | 亚洲综合第一区 | 亚洲桃色av| 春色激情 | 欧美女人一区二区 | 91精品美女 | 日本人极品人妖高潮 | 99色影院| 男男免费视频 | 夜夜嗨av一区二区三区四区 | 精品无码人妻少妇久久久久久 | 亚洲天天 | av一级网站 | 调教小屁屁白丝丨vk | 永久免费的网站入口 | 38在线视频 | 91精品小视频| 白峰美羽在线播放 | 亚洲啪啪av | 亚洲大色网 | 欧洲精品码一区二区三区免费看 | caoporen在线 | 亚洲av无码专区在线播放中文 | 亚洲av少妇一区二区在线观看 | 嫩草一区二区三区 | 日韩av手机在线播放 | 欧美男人又粗又长又大 | 91麻豆免费视频 | 国产av一区精品 | 人人爱人人插 | 69视频一区二区 | 欧美三级在线看 | 欧美在线中文 | 欧美色图17p| 中文字幕第23页 | 欧美男同又粗又长又大 | 中文字幕一区二区不卡 | 国产一区美女 | 日本黄色播放器 | 在线免费看黄av | 涩涩97 | 777色| 成人开心激情 | 日本草逼视频 | 黄色网入口 | 久久中文娱乐网 | 免费三片在线播放 | 国产精品国语 | 亚洲熟女一区二区 | 日韩一区二区免费在线观看 | 午夜av中文字幕 | 国产亚洲精品成人av在线 | 国产精品视频久久久 | 字幕网在线观看 | 免费荫蒂添的好舒服视频 | 成人福利视频在线 | 黄色片欧美 | 成人不卡视频 | 超碰成人久久 | 日韩精品免费在线观看 | 高清av不卡| 日韩电影一区二区三区 | 韩国伦理片在线播放 | 夜夜狠狠 | 中文字幕第一页在线 | 成人午夜激情网 | 成人高清视频免费观看 | 中文字幕免费高清视频 | 北条麻妃在线一区二区 | 九九精品在线观看 | 亚洲精品一区二区二区 | 黑人操bb| 久久av不卡 | 国产精品日韩一区二区 | √资源天堂中文在线 | 一卡二卡三卡 | 成人免费淫片aa视频免费 | va在线| 国产精品第八页 | 69热在线 | 亚洲精品一区二区18漫画 | 国产精品极品 | 亚洲天堂影院在线观看 | 日本熟妇浓毛 | 日韩av一卡二卡 | 香蕉久久影院 | 久久一区二区三区四区 | 综合天堂av久久久久久久 | 综合精品久久久 | 国产 日韩 欧美 制服丝袜 | 狠狠爱五月婷婷 | 91丨国产丨捆绑调教 | 懂色av一区二区三区 | 亚欧美在线观看 |