2009-11-30 112 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工作的最糟糕的方式...