gpt4 book ai didi

c - TCP connect() 总是通过

转载 作者:可可西里 更新时间:2023-11-01 02:57:04 26 4
gpt4 key购买 nike

我有一个非常简单的 TCP 客户端,如下所示。问题是 connect() 调用总是返回 0,即使另一端没有服务器也是如此。

int TcpSend(struct sockaddr_in* ipv4_client, const void* buffer, size_t size) {

int sd_client = 0;
int status = -1;

// Grab an ipv4 TCP socket.
sd_client = socket(AF_INET, SOCK_STREAM, 0);
if (sd_client == -1) {
return -1;
}

// Make the socket non-blocking so that connect may fail immediately
status = fcntl(sd_client, F_SETFL, O_NONBLOCK);
if (status < 0) {
close(sd_client);
return -1;
}

// Bind and connect
status = connect(sd_client, (struct sockaddr*)ipv4_client, sizeof(*ipv4_client));
if (status == -1) {
close(sd_client);
return -1;
}

printf("Status: %d %s\n", status, strerror(errno)); //// ??? : I always get status = 0 here

// Send a message to the server PORT on machine HOST.
// Ignore the fact that send might not have sent the complete data
status = send(sd_client, buffer, size, 0); //// Consequently I get a SIGPIPE here
if (status == -1) {
close(sd_client);
return -1;
}

close(sd_client);

return 0;
}

我知道如果只是绑定(bind)成功而连接没有发生,connect() 将通过。然而,当套接字被设置为 O_NONBLOCK 时,它不应该发生。代码总是在 connect() 处传递,我在 send() 中收到一个 SIGPIPE 错误。

最佳答案

以非阻塞模式连接后,您需要使用可写集中的套接字 FD 调用 select(),即等待它变为可写,然后 (1) 通过 getsockopt 检查套接字上的错误(), 或 (2) 再次调用 connect() 并检查错误。只有在这之后才开始调用 send()recv()。

关于c - TCP connect() 总是通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17716034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com