繁体   English   中英

多线程无法按预期工作

[英]Multithreading won't work as expected

我的程序有问题。 我希望它有两个线程,一个线程监听连接,另一个线程从中接收数据……不幸的是,它的行为很奇怪。 在代码的任何地方,它将忽略我的cout和cin用法,因此我什至无法调试它。 我可以要求有人对此有所说明吗? 先感谢您。

#include <windows.h>
#include <iostream.h>
#include <string.h>
#include <cstdlib>

int ConnectionNum, Port=4673;
WSADATA wsaData;
SOCKET Connections[256];

DWORD WINAPI ReceiveThread(LPVOID iValue)
{
    //this is going to be receiving TCP/IP packets, as soon as the connection works
}

DWORD WINAPI ListenThread(LPVOID iValue) //this thread is supposed to listen for new connections and store them in an array
{
    SOCKET ListeningSocket;
    SOCKET NewConnection;
    SOCKADDR_IN ServerAddr;
    SOCKADDR_IN ClientAddr;
    int ClientAddrLen;

    WSAStartup(MAKEWORD(2,2), &wsaData);
    ListeningSocket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    ServerAddr.sin_family=AF_INET;
    ServerAddr.sin_port=htons(Port);
    ServerAddr.sin_addr.s_addr=htonl(INADDR_ANY);

    bind(ListeningSocket, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr));

    if(listen(ListeningSocket, 5)!=0)
    {
        cout << "Could not begin listening for connections.";
        return 0;
    }

    ConnectionNum=0;

    while(ConnectionNum<256)
    {
        Connections[ConnectionNum]=accept(ListeningSocket, (SOCKADDR*)&ClientAddr, &ClientAddrLen);
        ConnectionNum++;

        cout << "New connection.";
    }
}

int main()
{
    HANDLE hThread1,hThread2;
    DWORD dwGenericThread;
    char lszThreadParam[3];

    hThread1=CreateThread(NULL, 0, ListenThread, &lszThreadParam, 0, &dwGenericThread);

    if(hThread1==NULL)
    {
        DWORD dwError=GetLastError();
        cout<<"SCM:Error in Creating thread"<<dwError<<endl ;
        return 0;
    }

    hThread2=CreateThread(NULL, 0, ReceiveThread, &lszThreadParam, 0, &dwGenericThread);

    if(hThread2==NULL)
    {
        DWORD dwError=GetLastError();
        cout<<"SCM:Error in Creating thread"<<dwError<<endl ;
        return 0;
    }

    system("pause"); //to keep the entire program from ending
}

我没有看到任何CIN调用这里。 至于对cout的调用,您可能必须刷新输出,因为它是在单独的线程中调用的。 您可以通过简单地调用std :: endl来实现

cout << "New connection." << std::endl;

您的cout调用未显示的原因可能是因为您向链接器提供了错误的参数。 您要指定/SUBSYSTEM:CONSOLE吗? (链接器属性的“系统”选项卡)。 如果不是,那么您不是在告诉操作系统为该程序创建控制台,您可能是在告诉它它是Windows程序,如果您的程序没有控制台,那么您将看不到程序cout输出...

一旦您可以看到调试...

我假设您正在从某种客户端连接到测试程序? 在连接到程序之前,什么都不会发生,这将导致对Accept()的调用返回。

顺便说一下, system("pause"); 这可能是实现所需目标的最糟糕的方法,但我想您只是这样做,因为您无法让cin工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM