中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

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
抚顺县| 阜宁县| 贺州市| 汝城县| 乌拉特后旗| 天门市| 祁东县| 龙井市| 饶平县| 福建省| 锦州市| 通海县| 邓州市| 庆阳市| 文登市| 称多县| 台州市| 犍为县| 滦南县| 东安县| 合作市| 海兴县| 诸城市| 沐川县| 梅州市| 绵竹市| 澄迈县| 会泽县| 临颍县| 梓潼县| 临湘市| 新沂市| 德惠市| 伽师县| 赤壁市| 古田县| 高雄县| 赫章县| 明溪县| 神木县| 安图县|