2009-11-30 5 views
0

프로그램에 문제가 있습니다. 두 개의 스레드가 있는데, 하나는 연결을 청취하고 다른 하나는 데이터를 수신하기를 원합니다 ... 불행히도, 그것은 이상하게 작동합니다. 코드 내의 모든 부분과 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

이상한 행동은 무엇인가 ... 아마 당신이 원하는하지만 당신은 당신이 cin이 동작하지 않습니다 수 있기 때문하고있는 가정 무엇을 달성하는 최악의 방법이다? – Alon

+0

코드에서 모든 cout 및 cin 호출을 무시합니다. 단순히 호출하지 않습니다. 나는 주 기능의 시작 부분에 한 통 (cout)과 cin (cin)을 넣었다. –

답변

1

는 여기 호출 어떤 CIN 표시되지 않습니다. cout에 대한 호출의 경우 출력이 별도의 스레드에서 호출되므로 플러시해야 할 수 있습니다. 당신은 단순히 표준을 호출하여이 작업을 수행 할 수 있습니다 :: endl의 : 당신은 링커에 잘못된 매개 변수를 공급하고 있기 때문에

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

+1 이것은 몇 차례 내 문제였습니다. 또한 "endl"대신 실제 endline 문자를 원하지 않으면 "flush"를 사용할 수 있습니다. –

+0

답해 주셔서 감사합니다. 나는 cin을 시도했지만 그것을 제거했습니다. 콘솔 작동 활성화, 감사합니다. 나는 여전히 연결에 문제가 있지만, 나는 그것을 처리 할 수 ​​있다고 생각합니다. 다시 한 번 감사드립니다! :) –

+0

다음에 도움이 된 대답을 수락하는 것이 좋을지도 모릅니다. –

1

당신의 cout 전화가 표시되지 않는 이유는 아마도입니다. /SUBSYSTEM:CONSOLE을 지정 하시겠습니까? (링커 속성의 시스템 탭). 그렇지 않다면 운영체제에 프로그램을위한 콘솔을 만들지 말고 Windows 프로그램이라고 말할 수 있습니다. 그리고 프로그램에 콘솔이 없으면 프로그램을 보지 못할 것입니다 cout ...

당신이 당신의 디버그를 볼 수 있습니다 일단

...

나는 당신이 어떤 종류의 클라이언트에서 테스트 프로그램에 연결하는 것 같은데요? 프로그램에 연결하기 전에는 Accept() 호출이 반환 될 때까지 아무 일도 일어나지 않습니다. 그런데

system("pause");

관련 문제