`
memorymyann
  • 浏览: 271122 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

12.套接口选项:套接口低潮限度

阅读更多

之前曾经提到过这个名词,套接口低潮限度。(以下都只针对TCP)

 

接收低潮限度(SO_RCVLOWAT):之前我们曾经使用过select函数,如果将套接口可读,也就是说套接口中有数据可以读出做为select的一个阻塞条件,则什么叫做有数据可读?其实就是指套接口中数据大小大于低潮限度。默认的低潮大小为1,也就是只要有数据到达就表示可读。

 

发送低潮限度(SO_SNDLOWAT):和上面一样,就是当你想对某个套接口执行write时候,如果空闲大小大于等于低潮限度就表示可写,也就是会从select函数返回。比如说下面的程序

#include "/programe/net/head.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "unistd.h"
#include "sys/wait.h"
#include "sys/select.h"
#include "sys/time.h"

#define MAXSIZE 100
#define LISTENQ 10

int main(int argc, char ** argv) {
        int listenfd, connfd;
        socklen_t client_len;
        struct sockaddr_in client_socket, serv_socket;
        char send[MAXSIZE + 1], recv[MAXSIZE + 1];


        listenfd = socket(AF_INET, SOCK_STREAM, 0);

        bzero(&serv_socket, sizeof(serv_socket));
        serv_socket.sin_family = AF_INET;
        serv_socket.sin_addr.s_addr = htonl(INADDR_ANY);
        serv_socket.sin_port = htons(atoi(argv[1]));
        bind(listenfd, (struct sockaddr *)&serv_socket, sizeof(serv_socket));
        listen(listenfd, LISTENQ);
        client_len = sizeof(client_socket);
        connfd = accept(listenfd, (struct sockaddr *)&client_socket, &client_len);
        int recv_min_size = 6;
        int flag = setsockopt(connfd, SOL_SOCKET, SO_RCVLOWAT, (void *)&recv_min_size, sizeof(int));

        //设置接受低潮
        int recv_min_size1;
        socklen_t recv_min_len = sizeof(recv_min_size1);
        getsockopt(connfd, SOL_SOCKET, SO_RCVLOWAT, (void *)&recv_min_size1, &recv_min_len);
        if(flag >= 0)
                printf("set SO_RCVLOWAT OK!!! SO_RCVLOWAT = %d\n", recv_min_size1);
        else
                printf("set SO_RCVLOWAT failed!!! SO_RCVLOWAT = %d\n", recv_min_size1);
        for(;;) {
                fd_set rest;
                FD_ZERO(&rest);
                FD_SET(1, &rest);
                FD_SET(connfd, &rest);
                int maxfdpl = 2;
                if(maxfdpl < connfd + 1)
                        maxfdpl = connfd + 1;
                int flag = select(maxfdpl, &rest, NULL, NULL, NULL); //  2
                if(flag <= 0) {
                        printf("some error happend, sorry");
                } else {
                        if(FD_ISSET(1, &rest)) {
                                int n = read(1, send, MAXSIZE);
                                send[n] = '\0';
                                write(connfd, send, n);
                        }
                        if(FD_ISSET(connfd, &rest)) {
                                int n = read(connfd, recv, MAXSIZE);
                                if(n == 0) {
                                        printf("client closed\n");
                                        break;
                                }
                                recv[n] = '\0';
                                printf("get message:%s", recv);
                        }
                }

        }
}

和之前的代码没有什么不同,只是增加了设置接受低潮。下面是客户端代码:

#include "/programe/net/head.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sys/select.h"

#define MAXSIZE 100

int main(int argc, char ** argv) {
        int sockfd;
        struct sockaddr_in serv_socket;
        int maxfdpl;
        char send[MAXSIZE], recv[MAXSIZE];

        if(argc != 2) {
                printf("please input port");
                exit(1);
        }

        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        bzero(&serv_socket, sizeof(serv_socket));
        serv_socket.sin_family = AF_INET;
        serv_socket.sin_port = htons(atoi(argv[1]));
        inet_pton(AF_INET, "192.168.1.235", &serv_socket.sin_addr);
        connect(sockfd, (struct sockaddr *)&serv_socket, sizeof(serv_socket));
        for(;;) {
                fd_set rset;
                FD_ZERO(&rset);
                FD_SET(1, &rset);
                FD_SET(sockfd, &rset);
                maxfdpl = sockfd + 1;
                select(maxfdpl, &rset, NULL, NULL, NULL); //  1
                if(FD_ISSET(sockfd, &rset)) {
                        int n = read(sockfd, recv, MAXSIZE);
                        if(!n) {
                                printf("server closed\n");
                                break;
                        }
                        recv[n] = '\0';
                        printf("get message from server:%s\n", recv);
                }
                if(FD_ISSET(1, &rset)) {
                        int n = read(1, send, MAXSIZE);
                        send[n] = '\0';
                        write(sockfd, send, n);
                }
        }
        close(sockfd);
        exit(0);
}

运行就会发现如果你输入的字符个数少于6(包括回车),select会继续阻塞。(注:我测试了一下,低潮限度只是会对select造成影响,不会对read和write函数的阻塞造成影响)

分享到:
评论

相关推荐

    公务员考试成语积累辨析.doc

    12. "烂熟于心":形容对某事或某物非常熟悉,就像刻在心里一样。 此外,还有一些成语在特定情境中的应用: 13. "英姿飒爽":形容人的英俊威武,精神饱满。 14. "精神抖擞":表示人的精神状态非常好,充满活力。 15....

    公务员考试 成语积累辨析.pdf

    12. "烂熟于心":形容对某事或某物非常熟悉,就像刻在心里一样。 13. "英姿飒爽":形容人的仪表英俊,精神饱满,常用于形容军人或运动员。 14. "精神抖擞":形容精神饱满,充满活力。 15. "威风凛凛":形容气势威严...

    面试面临的各种问题集合.pdf

    12. 理想工作:描述你对理想工作环境和职责的理解。 13. 家庭介绍:简洁地提及家庭情况,但避免过于私人的话题。 14. 挫败经历:展示你的韧性与恢复能力。 15. 面试经历:诚实回答,展示你对不同公司的了解和选择。 ...

    安全知识考试模拟试题(卷)(卷]答案.doc

    19. 心理健康与生理健康关系:钟南山院士指出心理状态对抵御疾病的能力有重大影响,情绪低潮可能导致生理健康下降80%。 20. 错构定义:错构是一种记忆错误,不是在病理状态下产生的信念。 21. 网购机票诈骗防范:...

    20秋地大《地球科学概论》在线作业二(参考答案).docx

    9. 海岸地貌:后滨的界限位于低潮线和高潮线之间,而非浪基面与低潮线、浪基面与高潮线或高潮线与特高潮线之间。 10. 变质作用类型:在变质过程中,既有原矿物消失又有新矿物形成,但总体化学成分不变,这是交代...

    2021届河北省鸿浩超级联考高三下学期地理4月模拟试题.doc

    9. 海岸地貌与沉积作用:海岸地貌中的沙粒大小受高潮、低潮和风力影响,通过地貌特征可以分析沉积过程。 10. 木麻黄的生态作用:木麻黄的种植主要用于防风固沙,保护海岸生态环境。 11. 时间与地理:清明节日期因...

    海洋测绘--模拟试题.pdf

    1. 测深基准面:我国以理论最低潮面作为测深基准面。 2. 海图比例尺:近海水域的海图比例尺一般不得小于 1:2.5 万。 3. 高程基准:1956 年国家高程基准是使用青岛验潮站 1950~1956 年的验潮数据推算得到。1985 年...

    江苏徐州鸿基雅园庭院美宅项目一期二阶段推广方案.pptx

    1. 销售状况:自2010年10月20日开盘以来,项目处于销售低潮,客户积累不足,媒体广告推广暂停。 2. 成交特点:自住客户为主要购买群体,其中自由职业者占比最大;二房二厅一卫的户型最受欢迎。 3. 客户来源:口碑...

    台湾的一个情绪管理及沟通技巧.pptx

    4. 应对心情低潮:寻找支持,保持乐观态度。 5. 容忍:学会宽容对待他人和自己。 良好的情绪管理特质包括: 1. 良好的内在修养:培养内心平静,增强自我控制。 2. 平衡的处世态度:不偏激,以平和心态看待事物。 3....

    领导人员管理能力.pptx

    4. 面对心情低潮:学会调整心态,寻找激励自己的动力。 5. 包容力:接纳他人的错误和不足,展现宽容和理解。 沟通能力的提升也至关重要,包括: 1. 良好沟通:清晰、准确地表达自己的想法和需求。 2. 积极倾听:...

    员工情绪管理实务.ppt

    4. 面对心情低潮:找到自我调节的方法,如寻求支持、改变环境或调整心态。 5. 包容力:学会接纳他人的不同,增强理解和宽容。 三、沟通能力的提升 1. 良好沟通:清晰表达意图,理解对方立场。 2. 积极倾听:专心...

    2018年注册测绘师考试及试题答案.docx

    6. 坐标转换:在进行两套平面坐标系之间的四参数坐标转换时,至少需要3个公共点来确定转换关系。 7. GPS网无约束平差:主要用于剔除粗差基线,提高GPS网的精度和可靠性,而不是检查闭合环误差。 8. 水准测量平差:...

    北塘2020年事业编招聘考试真题及答案解析可复制版(1).docx

    5. 情绪词汇与语境:题目中提到了词语在不同情境下的适用性,如“低潮”、“低回”、“低迷”等,它们都用来描述某种状态的消沉或低迷,但具体应用需要结合上下文。 6. 民事责任分配:在法律问题中,当动物造成他人...

    珠宝行业情绪管理方案分析.pptx

    4. 面对心情低潮:寻找支持系统,如朋友、家人或专业咨询。 5. 包容力:学会接受和理解他人的不同情绪,培养同理心。 沟通技巧是情绪管理的重要组成部分,包括: 1. 良好沟通:清晰、准确地表达自己的想法和感受。 ...

    商人最易犯的100个错误.doc

    1. 沉湎酒色:企业家沉溺于酒色可能源于不同原因,如无法控制欲望、事业低潮寻求慰藉、补偿心理或短暂享乐主义。这些行为会分散注意力,影响决策质量,从而危害企业稳定。 2. 投资冒险主义:企业家往往在缺乏充足...

    山东省枣庄市2019-2020学年高一地理上学期期末考试试题

    12. 潮汐规律:进港的最佳时间应避开高潮,考虑潮汐影响,24日的16时可能是低潮,较为适合大型船只进港。 13. 进港日期选择:考虑潮汐周期,27日的低潮时间可能比24日更有利于大吨位船舶进港。 14. 地貌识别:岱崮...

    河南省郑州市2019_2020学年高一地理上学期期末考试试题202003180247

    "白太阳"现象预示着太阳活动进入低潮期,太阳辐射、地表温度、地球降水和磁暴等活动会相应变化。 4. 地球公转:图3所示的地球公转轨道图中,①~②段代表夏至到秋分,②~③段代表秋分到冬至,③~④段代表冬至到...

    【天文学入门】 第8章.pptx

    1. 涨落潮、高潮、低潮和大小潮:海洋水面因引力变化而产生的周期性升降。 2. 引潮力:由月球和太阳引力差产生的地球局部变形和潮汐涨落的动力。 3. 太阳潮与太阴潮:分别由太阳和月球引力引起,其中太阴潮影响更为...

    上海市宝山区吴淞中学2020届高三物理上学期第二次月考试题(答案不全)沪科版.doc

    12. 电磁冲击钻原理:当开关S由闭合到断开瞬间,电路中磁场变化,产生反电动势,使得钻头M突然向右运动;B、C、D选项中,只要开关S保持闭合,变阻器滑片P的移动不会立即导致钻头运动。 13. 竖直振动的简谐运动:...

    2021报社实习总结范文.docx

    在无稿件发表的低潮期,仍要积极寻找选题,锻炼自己。 9. 心态调整:长时间的工作可能导致疲劳,要学会调整心态,如改变工作环境、与他人交流,以缓解压力。 10. 职业素养:记者需要具备全面的知识,能迅速适应新...

Global site tag (gtag.js) - Google Analytics