我设置了客户端/服务器,我希望我的客户端知道服务器是否已接受连接。否则我的客户不知道它还在等待被接受。我不能依赖进一步的通信(协议规范)来验证这一点。因此,例如,从服务器向客户端发送“Good to go”字符串不是一种选择。是否有标志或其他东西,我可以检查服务器是否确实收到?一些示例代码如下:
/* Client */
...
getaddrinfo(ip, port, &hints, &servinfo);
connect(sockfd, info->ai_addr, info->ai_addrlen);
if (info == NULL) {
printf("connection failure\n");
exit(1);
}
inet_ntop(info->ai_family, get_in_addr((struct sockaddr *)info->ai_addr), ipstring, sizeof(ipstring));
printf("Connected to %s!\n", ipstring);
...
/* Server */
...
pause(); /* If don't accept the connection, how to make the client know? */
new_fd = accept(sockfd, (struct sockaddr *)&cli_addr, &addr_size);
...
答案 0 :(得分:4)
由于积压,服务器可以在接受呼叫之前发送SYN-ACK。因此,客户端调用connect()
可以在服务器调用accept()
之前返回。
正如你所说:服务器上的“Good to go”消息不是选项。 怎么样:来自客户端的“回声”请求。因此,服务器将在接受后作出回应。
如果TCP流中的任何额外流量不是一个选项。你能使用辅助数据吗?
答案 1 :(得分:2)
您应该检查connect()
的返回值,因为它会通过errno
指示失败的原因。
您案件中的connect()
来电将超时,因此connect()
将返回-1
而errno
将设为ETIMEDOUT
int ret = connect(sockfd, info->ai_addr, info->ai_addrlen);
if (ret == -1) {
/* connect failed */
switch(errno) {
case ETIMEDOUT:
/* your server didn't accept the connection */
case ECONNREFUSED:
/* your server isn't listening yet, e.g. didn't start */
default:
/* any other error, see man 2 connect */
}
}