亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

linux 客戶端 Socket 非阻塞connect編程

小億
83
2023-12-20 19:40:43
欄目: 編程語言

在Linux中,可以使用非阻塞IO(Non-blocking IO)來實現非阻塞connect的編程。

以下是一個簡單的示例代碼,演示如何在Linux中使用非阻塞connect進行Socket編程:

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>

int main() {
    // 創建Socket
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd == -1) {
        std::cerr << "Failed to create socket." << std::endl;
        return 1;
    }

    // 設置Socket為非阻塞
    int flags = fcntl(sockfd, F_GETFL, 0);
    if (flags == -1) {
        std::cerr << "Failed to get socket flags." << std::endl;
        return 1;
    }
    if (fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) == -1) {
        std::cerr << "Failed to set socket to non-blocking mode." << std::endl;
        return 1;
    }

    // 設置連接目標地址
    struct sockaddr_in server_addr{};
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(12345);
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    // 嘗試非阻塞連接
    int ret = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
    if (ret == -1) {
        if (errno == EINPROGRESS) {
            // 連接正在進行中,等待連接完成
            fd_set write_fds;
            FD_ZERO(&write_fds);
            FD_SET(sockfd, &write_fds);

            struct timeval timeout{};
            timeout.tv_sec = 5;  // 設置連接超時時間為5秒

            ret = select(sockfd + 1, nullptr, &write_fds, nullptr, &timeout);
            if (ret == -1) {
                std::cerr << "Failed to select." << std::endl;
                return 1;
            } else if (ret == 0) {
                // 連接超時
                std::cerr << "Connect timeout." << std::endl;
                return 1;
            } else {
                // 連接完成,檢查連接是否成功
                int error = 0;
                socklen_t len = sizeof(error);
                if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) == -1) {
                    std::cerr << "Failed to get socket option." << std::endl;
                    return 1;
                }
                if (error != 0) {
                    std::cerr << "Failed to connect: " << strerror(error) << std::endl;
                    return 1;
                }
            }
        } else {
            std::cerr << "Failed to connect: " << strerror(errno) << std::endl;
            return 1;
        }
    }

    std::cout << "Connected successfully." << std::endl;

    // 連接成功后,可以進行后續操作

    close(sockfd);

    return 0;
}

在上述代碼中,首先創建了一個Socket,并將其設置為非阻塞模式。然后,通過connect函數進行非阻塞連接。如果connect返回-1,并且errno為EINPROGRESS,說明連接正在進行中,此時可以通過select函數等待連接完成。如果select返回0,表示連接超時。如果select返回大于0,說明連接已完成,可以通過getsockopt函數獲取連接結果。如果連接成功,可以進行后續操作。

注意,上述代碼只是一個簡單的示例,實際使用中可能需要根據具體情況進行適當的修改和優化。

0
库车县| 峡江县| 赣州市| 会昌县| 南安市| 滁州市| 维西| 蓬莱市| 宜都市| 连平县| 会泽县| 宜州市| 卓资县| 县级市| 内黄县| 鲁甸县| 高淳县| 五河县| 贵港市| 荣昌县| 田林县| 疏附县| 迭部县| 青铜峡市| 米泉市| 道真| 岢岚县| 马边| 修文县| 博爱县| 文成县| 阜城县| 桐梓县| 嘉定区| 巴中市| 宜昌市| 镇安县| 开江县| 诸城市| 蒲江县| 通渭县|