关于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
相关产品推荐
相关产品推荐

