SPRING :: NOTE

[C] 윈도우 소켓을 이용한 TCP/IP 통신 - SERVER 본문

Development Language/C · C++ · MFC

[C] 윈도우 소켓을 이용한 TCP/IP 통신 - SERVER

RAYZIE 2017. 9. 15. 17:36
반응형

쓰레드(Thread)를 이용한 방식

[Development Language/C · C++ · MFC] - [C] 윈도우 소켓을 이용한 TCP/IP 통신 - SERVER

[Development Language/C · C++ · MFC] - [C] 윈도우 소켓을 이용한 TCP/IP 통신 - CLIENT


#include 
#include 
#include 
#include 
#include 
 
#define BUF_SIZE 100
#define MAX_CLNT 256
 
unsigned WINAPI HandleClient(void* arg);//쓰레드 함수
void SendMsg(char* msg,int len);//메시지 보내는 함수
void ErrorHandling(char* msg);
 
int clientCount=0;
SOCKET clientSocks[MAX_CLNT];//클라이언트 소켓 보관용 배열
HANDLE hMutex;//뮤텍스
 
int main(int argc,char* argv[]){
    WSADATA wsaData;
    SOCKET serverSock,clientSock;
    SOCKADDR_IN serverAddr,clientAddr;
    int clientAddrSize;
    HANDLE hThread;
    if(argc!=2){
        printf("Usage : %s \n",argv[0]);
        exit(1);
    }
    if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) //윈도우 소켓을 사용하겠다는 사실을 운영체제에 전달
        ErrorHandling("WSAStartup() error!");
 
    hMutex=CreateMutex(NULL,FALSE,NULL);//하나의 뮤텍스를 생성한다.
    serverSock=socket(PF_INET,SOCK_STREAM,0); //하나의 소켓을 생성한다.
 
    memset(&serverAddr,0,sizeof(serverAddr));
    serverAddr.sin_family=AF_INET;
    serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);
    serverAddr.sin_port=htons(atoi(argv[1]));
 
    if(bind(serverSock,(SOCKADDR*)&serverAddr,sizeof(serverAddr))==SOCKET_ERROR) //생성한 소켓을 배치한다.
        ErrorHandling("bind() error");
    if(listen(serverSock,5)==SOCKET_ERROR)//소켓을 준비상태에 둔다.
        ErrorHandling("listen() error");
 
    while(1){
        clientAddrSize=sizeof(clientAddr);
        clientSock=accept(serverSock,(SOCKADDR*)&clientAddr,&clientAddrSize);//서버에게 전달된 클라이언트 소켓을 clientSock에 전달
        WaitForSingleObject(hMutex,INFINITE);//뮤텍스 실행
        clientSocks[clientCount++]=clientSock;//클라이언트 소켓배열에 방금 가져온 소켓 주소를 전달
        ReleaseMutex(hMutex);//뮤텍스 중지
        hThread=(HANDLE)_beginthreadex(NULL,0,HandleClient,(void*)&clientSock,0,NULL);//HandleClient 쓰레드 실행, clientSock을 매개변수로 전달
        printf("Connected Client IP : %s\n",inet_ntoa(clientAddr.sin_addr));
    }
    closesocket(serverSock);//생성한 소켓을 끈다.
    WSACleanup();//윈도우 소켓을 종료하겠다는 사실을 운영체제에 전달
    return 0;
}
 
unsigned WINAPI HandleClient(void* arg){
    SOCKET clientSock=*((SOCKET*)arg); //매개변수로받은 클라이언트 소켓을 전달
    int strLen=0,i;
    char msg[BUF_SIZE];
 
    while((strLen=recv(clientSock,msg,sizeof(msg),0))!=0) //클라이언트로부터 메시지를 받을때까지 기다린다.
        SendMsg(msg,strLen);//SendMsg에 받은 메시지를 전달한다.
 
    //이 줄을 실행한다는 것은 해당 클라이언트가 나갔다는 사실임 따라서 해당 클라이언트를 배열에서 제거해줘야함
    WaitForSingleObject(hMutex,INFINITE);//뮤텍스 실행
    for(i=0;i


반응형
Comments