You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于TCP连接创建代码的三类技术问题咨询

TCP连接代码常见问题解答

问题1:成功建立连接时哪里返回文件描述符?

这段代码中,所有错误分支(主机解析失败、套接字创建失败、绑定失败、连接失败)都会通过return -1终止函数并返回错误标识。当所有操作都成功完成后,函数会执行末尾的return s;语句,其中s就是成功创建并完成连接的TCP套接字文件描述符,这就是连接成功后的返回值。

问题2:connect(...) < 0的含义是什么?

connect()是用于发起TCP连接的系统调用,它的返回规则是:连接成功时返回0,失败时返回-1,同时会设置全局变量errno来记录具体的错误类型(比如连接超时、目标主机不可达等)。代码中的< 0就是用来判断connect调用是否失败,一旦条件成立,就会进入错误处理流程——打印错误信息、关闭已创建的套接字、返回-1告知调用者连接失败。

问题3:代码中哪个是读取请求的函数?不存在的话请提供示例

这段tcpconnect函数仅负责完成TCP连接的建立流程,没有包含读取数据/请求的逻辑。如果需要从已连接的套接字中读取数据,可以使用read()或recv()系统调用。以下是包含连接建立和数据读取的完整示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

int tcpconnect(char *host, int port) {
    struct hostent *h;
    struct sockaddr_in sa;
    int s;

    h = gethostbyname(host);
    if (!h || h->h_length != sizeof(struct in_addr)) {
        fprintf(stderr, "%s: no such host\n", host);
        return -1;
    }

    s = socket(AF_INET, SOCK_STREAM, 0);
    if (s < 0) {
        perror("socket");
        return -1;
    }

    bzero(&sa, sizeof(sa));
    sa.sin_family = AF_INET;
    sa.sin_port = htons(0);
    sa.sin_addr.s_addr = htonl(INADDR_ANY);
  
    if (bind(s, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
        perror("bind");
        close(s);
        return -1;
    }

    sa.sin_port = htons(port);
    sa.sin_addr = *(struct in_addr *)h->h_addr;
  
    if (connect(s, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
        perror(host);
        close(s);
        return -1;
    }
    return s;
}

int main(int argc, char *argv[]) {
    if (argc != 3) {
        fprintf(stderr, "Usage: %s <host> <port>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    int sockfd = tcpconnect(argv[1], atoi(argv[2]));
    if (sockfd < 0) {
        exit(EXIT_FAILURE);
    }

    char buffer[1024];
    ssize_t bytes_read;

    // 读取服务器发送的数据
    bytes_read = read(sockfd, buffer, sizeof(buffer) - 1);
    if (bytes_read < 0) {
        perror("read");
        close(sockfd);
        exit(EXIT_FAILURE);
    } else if (bytes_read == 0) {
        printf("Server closed the connection\n");
    } else {
        buffer[bytes_read] = '\0'; // 补充字符串结束符
        printf("Received data: %s\n", buffer);
    }

    close(sockfd);
    return 0;
}

示例中,main函数先调用tcpconnect建立连接,之后使用read()从套接字中读取数据,同时处理了读取失败、服务器主动关闭连接等场景,确保逻辑的健壮性。

内容的提问来源于stack exchange,提问作者Katelyn Chenelle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 00:09:23