본문 바로가기

Study/Programming

윈도우기반 멀티플렉싱 서버 예제

감사


안녕하세요 꼬로미입니다~


간만에 포스팅하네요!


후들후들 중간고사가 드디어 끝났어요


고로 꾸준한 포스팅을 하려 노력하겠숩니당


헤헤헤헤




멀티프로세스

하나의 프로세스가 다수의 클라이언트에게 서비스를 할 수 있도록 한다.

이를 위해서는 하나의 프로세스가 여러 개의 소켓을 핸들링 할 수 있는 방법이 존재해야 한다.

바로 이것이 IO 멀티플렉싱이다. 







서버 소스


------------------------------------------------------------------------------------------------------------

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <winsock2.h>


#define BUF_SIZE 1024


int main(int argc, char *argv[]){

WSADATA wsaData;

SOCKET hServSock, hClntSock;

SOCKADDR_IN servAdr, clntAdr;

TIMEVAL timeout;

fd_set reads, cpyReads;


int adrSz;

int strLen, fdNum, i;

char buf[BUF_SIZE];


if(argc!=2){

printf("USAGE:%s <port> \n", argv[0]);

exit(1);

}

if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)

exit(1);


hServSock=socket(PF_INET, SOCK_STREAM, 0);

memset(&servAdr, 0, sizeof(servAdr));

servAdr.sin_family=AF_INET;

servAdr.sin_addr.s_addr=htonl(INADDR_ANY);

servAdr.sin_port=htons(atoi(argv[1]));


if(bind(hServSock, (SOCKADDR*) & servAdr, sizeof(servAdr))==SOCKET_ERROR)

exit(1);

if(listen(hServSock, 5)==SOCKET_ERROR)

exit(1);


FD_ZERO(&reads);

FD_SET(hServSock, &reads);


while(1)

{

cpyReads=reads;

timeout.tv_sec=5;

timeout.tv_usec=5000;


if((fdNum=select(0, &cpyReads, 0, 0, &timeout))==SOCKET_ERROR)

break;


if(fdNum==0)

continue;


for(i=0; i<reads.fd_count; i++){

if(FD_ISSET(reads.fd_array[i], &cpyReads)){

if(reads.fd_array[i]==hServSock){

adrSz=sizeof(clntAdr);

hClntSock=accept(hServSock, (SOCKADDR*)&clntAdr, &adrSz);

FD_SET(hClntSock, &reads);

printf("conncted client: %d\n", hClntSock);

}

else{

strLen=recv(reads.fd_array[i], buf, BUF_SIZE-1, 0);

if(strLen==0){

FD_CLR(reads.fd_array[i], &reads);

closesocket(cpyReads.fd_array[i]);

printf("closed client: %d\n", cpyReads.fd_array[i]);

}

else

{

send(reads.fd_array[i], buf, strLen, 0);

}

}

}

}

}

closesocket(hServSock);

WSACleanup();

return 0;

}

------------------------------------------------------------------------------------------------------------

서버는 이전에 했던 소스로~






실행화면

cmd로 3개의 클라이언트를 보여주는 화면