C 套接字和连接while循环中的调用
我需要在一段时间内循环一个C 套接字和连接while循环中的调用,c,sockets,while-loop,C,Sockets,While Loop,我需要在一段时间内循环一个connect调用,直到连接实际完成 我第一次写这个: ... int sockFd; struct sockaddr_in serverAddr; memset(&serverAddr, '\0', sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(atoi(server->port)); serverAddr.sin_addr.s
connect
调用,直到连接实际完成
我第一次写这个:
...
int sockFd;
struct sockaddr_in serverAddr;
memset(&serverAddr, '\0', sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(atoi(server->port));
serverAddr.sin_addr.s_addr = inet_addr(server->ip);
if ((sockFd = socket(AF_INET, SOCK_STREAM, 0)) == -1) perror("[-] Socket error!"), exit(-1);
int checkValue;
do {
if((checkValue = connect(sockFd, (struct sockaddr*) &serverAddr, sizeof(serverAddr))) != 0) perror("[-] Connect error!");
} while (checkValue != 0);
...
这在我看来似乎是合乎逻辑的,但当我执行程序时,在第一次“尝试”连接后,connect
会导致一个“无效参数”错误,但如果我将套接字创建移动到循环中,如下所示:
int sockFd;
struct sockaddr_in serverAddr;
memset(&serverAddr, '\0', sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(atoi(server->port));
serverAddr.sin_addr.s_addr = inet_addr(server->ip);
int checkValue;
do {
if ((sockFd = socket(AF_INET, SOCK_STREAM, 0)) == -1) perror("[-] Socket error!"), exit(-1);
if((checkValue = connect(sockFd, (struct sockaddr*) &serverAddr, sizeof(serverAddr))) != 0) {
close(sockFd);
}
} while (checkValue != 0);
该程序运行良好,但如果连接失败,我会打开和关闭这么多套接字,这一事实并不能说服我
有什么建议吗?我不知道如何结束这个问题,所以: 我的第二个建议是正确的
谢谢大家的建议 即使先前的连接尝试失败,也无法重新连接TCP套接字。您必须关闭套接字并创建一个新的套接字。你对此没有任何选择。所以我的第二个版本是对的?是的,从这个角度来看是正确的,但它可以通过睡眠、一些日志记录以及区分暂时性错误和永久性错误,而不是仅仅假设问题是外部的,并且会神奇地自行修复。定义“不能使用日志功能”。这太荒谬了。@Serus
perror()
做日志记录,它向stderr
写入一行文本。