SPRING :: NOTE
[C] 윈도우 소켓을 이용한 TCP/IP 통신 - SERVER 본문
반응형
쓰레드(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
반응형
'Development Language > C · C++ · MFC' 카테고리의 다른 글
[MFC] 모달리스 다이얼로그 (Modaless Dialog) 생성 및 실행 (0) | 2017.09.20 |
---|---|
[C] 윈도우 소켓을 이용한 TCP/IP 통신 - CLIENT (0) | 2017.09.15 |
[MFC] VS2008을 이용한 시리얼 통신 프로그램 만들기 (0) | 2017.09.06 |
[MFC] 디렉토리(폴더) 선택 다이얼로그 띄우기 (1) | 2017.01.18 |
[MFC] 폴더에서 파일 갯수 구하기 (0) | 2017.01.18 |
Comments