【发布时间】:2023-01-08 09:11:43
【问题描述】:
如果在我调用此函数之前服务器正在运行,则以下 TCP/IP 客户端代码将按预期工作。如果服务器没有运行,connect() 立即返回并打印 errno = 111, connection refused。我最终在一个无限的 while 循环中调用 connect(),调用之间有 1 秒的延迟。当服务器启动时,代码连接并退出循环。问:connect() 在阻塞模式下应该如何工作?如果是这样,有没有办法配置connect()等到服务器运行后再返回?
int socket_connect(const char *host, int port, int timeout)
{
struct sockaddr_in sa;
struct hostent *hp;
int sockfd = -1;
hp = gethostbyname(host);
if (hp == NULL)
{
return -1;
}
sa.sin_family = AF_INET;
sa.sin_port = htons(port);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
int status = connect(sockfd, (struct sockaddr *)&sa, sizeof(sa));
if (status != 0)
{
close(sockfd);
printf("errno = %d\n",errno);
return -2;
}
...
【问题讨论】:
-
是的,这就是它应该的工作方式。它没有内置的方法来等待服务器自动启动
-
connect尝试“连接”到指定的主机。它只做一件事,导致成功或失败。由用户决定下一步要做什么。要么尝试重复连接过程进行有限次数的尝试,要么显示一条错误消息,表明服务器似乎已关闭(稍后再试)。