Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 套接字和连接while循环中的调用_C_Sockets_While Loop - Fatal编程技术网

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
写入一行文本。