zoukankan      html  css  js  c++  java
  • linux connect非阻塞

    默认情况下,socket通信中,client用connect来连接server端时是阻塞的。这回导致程序会阻塞在此。

    可以改用异步机制。方法如下:

    1)设置socket为非阻塞。

     int flags = fcntl(fd, F_GETFL, 0);
     fcntl(fd, F_SETFL, flags | O_NONBLOCK);

    2)设置connect为异步

        int err = -1,  ret = -1, res = -1;

     ret = connect(fd, (struct sockaddr*) &servaddr, sizeof(struct sockaddr_in));
    if (ret < 0) {
      if(errno != EINPROGRESS) {
        return -1;
    } else { //连接正在建立
      struct timeval tm;
      tm.tv_sec = ; // 3s
      tm.tv_usec = 0;

    fd_set fset;
    FD_ZERO(&fset);
    FD_SET(fd, &fset);

    res = select(fd+1, NULL, &fset, NULL, &tm);
    if(res <= 0) {
    return -1;
    } else {
    if(FD_ISSET(fd, &fset)) {
     
    socklen_t len = sizeof(int);
    if(getsockopt(fd, SOL_SOCKET, SO_ERROR, &err, &len ) < 0) { //两种错误处理方式
    return -1;
    }
    if(err) {
    errno = err;
    return -1;
    }
    return 0;
    } else {
    return -1;
    }
    }
    }
    } else {
    return ret;
    }
    当我们以非阻塞的方式来进行连接的时候,返回的结果如果是 -1,这并不代表这次连接发生了错误,如果它的返回结果是 EINPROGRESS,那么就代表连接还在进行中。
    后面可以通过poll或者select来判断socket是否可写,如果可以写,说明连接完成了。
     
     
    参考连接:
  • 相关阅读:
    abstract,virtual,override个人
    abstract,virtual,override
    C#,File.AppendAllLines(),换行" "
    WPF,ComboBox,取汉字首字母,extBoxBase.TextChanged
    Task
    C# Task,new Task().Start(),Task.Run();TTask.Factory.StartNew
    C# async,await
    C#,二分法,BinarySearch()
    C#,Task
    css权重
  • 原文地址:https://www.cnblogs.com/rohens-hbg/p/14079337.html
Copyright © 2011-2022 走看看