zoukankan      html  css  js  c++  java
  • getsockopt和accept需要注意的两个细节

    1,getsockopt连续调用问题

    通常情况下,在一个socket fd上出现错误时,我们会通过

    int status;
    socklen_t slen;
    getsockopt(fd, SOL_SOCKET, SO_ERROR, (void *) &status, &slen);
    

      这种方法来获取具体的错误原因。

    如果fd上出现了错误,那么第一次调用getsockopt会通过status返回错误原因。如果此时并没有调用close(fd),按理说这个错误在fd上依然存在,但是如果再次调用上面的getsockopt,则会告知用户此fd上没有任何错误。。。这种情况经常会发生在函数之间传递fd时,一个函数A里面做了getsockopt判断,之后将fd传至别的函数B,函数B不知道fd的状态,再次调用getsockopt,会误认为fd上没有错误了。

       所以如果在fd上没有任何读写操作的话,fd上的getsockopt要只调用一次,之后,要将该次getsockopt的状态和fd一起传递给别的函数。免得出现上面的问题。

    2,accept的参数问题

    通常情况下,一个socket fd上等待请求,会像下面这样做:

    int clifd, clilen;
    sockaddr_in cliaddr;
    clifd = accept(listen_fd, (struct sockaddr*) &cliaddr, &clilen);
    

      这样是一个成功的accept调用,但是在accept返回后,你无法通过cliaddr拿到对端的IP信息。你会发现你用inet_ntop(AF_INET, &cliaddr, ip_buf, sizeof(ip_buf))得到的竟然是一个乱七八糟的对端IP地址。

          正确的做法是这样:

    sockaddr_in cliaddr;
    int clifd, clilen = sizeof(cliaddr);
    clifd = accept(listen_fd, (struct sockaddr*) &cliaddr, &clilen);
    

      看出差别了吗?

  • 相关阅读:
    Realtime crowdsourcing
    maven 常用插件汇总
    fctix
    sencha extjs4 command tools sdk
    首次吃了一颗带奶糖味的消炎药,不知道管用不
    spring mvc3 example
    ubuntu ati driver DO NOT INSTALL recommand driver
    yet another js editor on windows support extjs
    how to use springsource tools suite maven3 on command
    ocr service
  • 原文地址:https://www.cnblogs.com/cobbliu/p/3799059.html
Copyright © 2011-2022 走看看