2009-11-30 11 views
0

J'ai un problème avec mon programme. Je voulais qu'il y ait deux threads, l'un d'entre eux écoutant les connexions, et l'autre recevant des données de leur part ... Malheureusement, il agit étrangement. Il ignorera mon usage de cout et cin partout dans le code, donc je ne peux même pas le déboguer. Puis-je demander à quelqu'un de faire la lumière? Merci d'avance.Le multithread ne fonctionnera pas comme prévu

#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

quel est le comportement étrange? – Alon

+0

Il ignore tous les appels cout et cin partout dans le code, il ne les appellera tout simplement pas. J'ai mis un cout et un cin au début de la fonction principale, il ne s'est pas montré non plus. –

Répondre

1

Je ne vois pas de cin appelle ici. Comme pour les appels à cout, vous devrez peut-être vider la sortie, car il est appelé dans un thread distinct. Vous pouvez le faire en appelant simplement std :: endl:

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

+1 Cela a été mon problème à quelques reprises. Aussi, au lieu de "endl" vous pouvez utiliser "flush" si vous ne voulez pas le caractère final. –

+0

Merci pour vos deux réponses. J'ai essayé le cin, mais l'ai enlevé. L'activation de la console a fonctionné, merci. J'ai toujours des problèmes de connexion, mais je pense que je peux m'en sortir. Merci encore! :) –

+0

Il pourrait être une idée d'accepter la réponse qui vous a aidé alors ... –

1

La raison pour laquelle vos appels cout n'apparaissent pas est peut-être parce que vous fournir les paramètres incorrects à l'éditeur de liens. Spécifiez-vous /SUBSYSTEM:CONSOLE? (Onglet Système des propriétés du Linker). Sinon, vous ne dites pas au système d'exploitation de créer une console pour le programme, vous pouvez lui dire que c'est un programme Windows, et si vous programmez n'a pas de console, alors vous ne verrez pas vos programmes cout sortie ...

une fois que vous pouvez voir votre debug ...

Je suppose que vous vous connectez à votre programme de test d'un client de quelque sorte? Rien ne se passera jusqu'à ce que vous vous connectiez à votre programme, ce qui provoquera l'appel à Accept() pour retourner.

Par ailleurs, system("pause"); est probablement la pire façon de réaliser ce que vous voulez, mais je suppose que vous faites seulement parce que vous ne pouvez pas obtenir cin pour travailler ...