2009-11-30 116 views
0

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

有什么奇怪的行为? – Alon 2009-11-30 12:28:55

+0

它忽略了代码中的所有cout和cin调用,它根本不会调用它们。我在主函数的开头放了一个cout和一个cin,它也没有出现。 – 2009-11-30 12:33:49

回答

1

我没有看到任何CIN要求在这里。至于cout的调用,您可能需要刷新输出,因为它是在单独的线程中调用的。您可以通过简单地调用STD为此:: ENDL

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

+1这是我的问题几次。如果您不想使用实际的结束符,也可以使用“flush”来代替“endl”。 – 2009-11-30 12:56:29

+0

谢谢你的答案。我一直在尝试cin,但删除它。激活控制台的工作,谢谢。我仍然有连接问题,但我认为我可以处理它。再次感谢! :) – 2009-11-30 13:11:20

+0

接受帮助你的答案可能是一个主意...... – 2009-11-30 14:32:59

1

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

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

我假设你是从某种类型的客户端连接到您的测试计划?直到连接到会导致调用Accept()返回的程序时,才会发生任何事情。

顺便说一句,system("pause");可能达到你想要什么,但我以为你只是这样做,因为你不能得到cin工作的最糟糕的方式...