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);
    

      看出差别了吗?

  • 相关阅读:
    [APIO2014]序列分割
    [USACO08MAR]土地征用Land Acquisition
    Cats Transport
    [ZJOI2007]仓库建设
    [CEOI2004]锯木厂选址
    Print Article
    Interval 间隔问题
    Trie树
    动态规划-子数组乘积小于k的总个数 Subarray Product Less Than K
    动态规划-独特的子字符串存在于Wraparound String总个数 Unique Substrings in Wraparound String
  • 原文地址:https://www.cnblogs.com/cobbliu/p/3799059.html
Copyright © 2011-2022 走看看