多线程不会按预期工作

时间:2009-11-30 12:24:23

标签: c++ multithreading winsock

我的程序有问题。我希望它有两个线程,其中一个监听连接,另一个从它们接收数据......不幸的是,它的行为很奇怪。它将忽略我在代码中的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
}

2 个答案:

答案 0 :(得分:1)

我在这里看不到任何 cin 电话。至于对 cout 的调用,您可能必须刷新输出,因为它是在单独的线程中调用的。您只需调用 std :: endl

即可完成此操作
cout << "New connection." << std::endl;

答案 1 :(得分:1)

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

一旦你看到你的调试......

我假设您从某种类型的客户端连接到您的测试程序?在连接到程序之前不会发生任何事情,这将导致调用Accept()返回。

顺便说一句,system("pause");可能是实现你想要的最糟糕的方式,但我认为你只是这样做,因为你无法让cin工作......