www.pudn.com > multichatting_program.zip > server.cpp, change:2008-06-12,size:4818b


#include <stdio.h> 
#include <process.h> 
#include <winsock.h> 
#include <windows.h> 
 
#pragma comment(lib, "wsock32.lib")	//À©¼Ó Ãß°¡ 
#define MAXCLIENT 5		// ÃÖ´ë Çã¿ë Àοø ¼ö ¼³Á¤ ¸ÅÅ©·Î 
#define MAXSOCKETNUM 65535		// ÃÖ´ë »ý¼º °¡´É ¼ÒÄÏ ¹øÈ£ ¼³Á¤ ¸ÅÅ©·Î 
 
void receive_client(void *ns);		// ½º·¹µå ÇÔ¼ö ÇÁ·ÎÅä ŸÀÔ 
void SetColor(int color){ //»ö±ò ÁöÁ¤ ÇÔ¼ö 
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color); 
} 
 
int client_num = 0;			// Ŭ¶óÀÌ¾ðÆ® °¹¼ö 
int num = 0;			// Ŭ¶óÀÌ¾ðÆ® ¹øÈ£ 
char msg_client[] = "¹ø Ŭ¶óÀ̾ðÆ®, ȯ¿µÇÕ´Ï´Ù.\n\0";	// Welcome  
char msg_full[] = "°¡µæÃ¡½À´Ï´Ù.\n";		     	// »ç¿ëÀÚ Ãʰú½Ã 
int client_sock[MAXSOCKETNUM];		// client_sock  
HANDLE hMutex = 0;		// ¹ÂÅýº 
 
int main() 
{	 
	SOCKADDR_IN clientaddr; 
 
	int listen_sock; 
	int addrlen; 
 
	SetColor(8); 
	printf("¦£¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¤\n"); 
	printf("¦¢               Multi Chatting Program                 ¦¢\n"); 
	printf("¦¢                    - Server -                        ¦¢\n"); 
	 
	 
	int retval; 
 
	// ¹ÂÅýº ¿ÀºêÁ§Æ® »ý¼º 
	hMutex = CreateMutex(NULL, FALSE, NULL); //ÀÎÀÚ°ª(º¸¾È°ü·ÃƯ¼º, ¹ÂÅØ½º ¼ÒÀ¯ÀÚ À¯¹«, »ý¼ºµÈ ¹ÂÅØ½º¿¡ À̸§À» ÁÙ°ÇÁö ¿©ºÎ) 
	if(!hMutex) 
	{ 
		printf("Mutex Error\n"); 
		CloseHandle(hMutex); 
		return -1; 
	} 
 
	// À©¼Ó ÃʱâÈ­ 
	WSADATA wsa; 
	if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)	 
		return -1; 
 
	// socket() 
	listen_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
	if (listen_sock == SOCKET_ERROR) 
	{ 
		printf("socket() Error\n"); 
		return -1; 
	} 
 
	// bind() 
	SOCKADDR_IN serveraddr ; 
	serveraddr.sin_family = AF_INET; 
	serveraddr.sin_port = htons(6000); 
	serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); 
 
	retval = bind(listen_sock, (sockaddr*)&serveraddr, sizeof(serveraddr)); 
 
	if( retval == SOCKET_ERROR) 
	{ 
		printf("bind() Error\n"); 
		return -1; 
	} 
 
 
	printf("¦¢           Á¢¼Ó °¡´ÉÇÑ Å¬¶óÀ̾ðÆ®ÀÇ ¼ö : %d            ¦¢\n", MAXCLIENT - client_num); 
	printf("¦¦¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¥\n"); 
	listen(listen_sock,10); 
 
	SetColor(15); 
 
	//Ŭ¶óÀÌ¾ðÆ®°¡ ¿¬°áµÇ±â¸¦ ±â´Ù¸°´Ù. 
	while(1) 
	{ 
		//accept() 
		addrlen = sizeof(clientaddr); 
		client_sock[num] = accept(listen_sock, (sockaddr*)&clientaddr, &addrlen); 
 
		//Ŭ¶óÀ̾ðÆ®ÀÇ ÃÖ´ëÇã¿ë°¹¼ö±îÁö ¹Þ¾ÆµéÀδÙ. 
		if(client_num  MAXCLIENT)	 
		{ 
			_beginthread(receive_client, 0, &client_sock[num]); //½º·¹µå »ý¼º 
			Sleep(10); 
			printf("%d¹ø Ŭ¶óÀÌ¾ðÆ® %s:  %dÆ÷Æ®¿¡¼­ Á¢¼ÓÇÏ¿´½À´Ï´Ù\n", num, inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port)); 
		} 
		//ÃÖ´ëÇã¿ëÀ» Ãʰú½Ã msg_full¸Þ¼¼Áö¸¦ º¸³»°í Á¢¼ÓÀ» ²÷´Â´Ù. 
		else 
		{ 
			addrlen = sizeof(clientaddr); 
			if (client_sock[num] == INVALID_SOCKET) 
			{ 
				printf("accept() Error\n"); 
				closesocket(client_sock[num]); 
				closesocket(listen_sock); 
				WSACleanup(); 
				return -1; 
			} 
			retval = send(client_sock[num], msg_full, sizeof(msg_full), 0); 
			closesocket(client_sock[num]); 
		} 
	} 
	return 0; 
} 
 
void receive_client(void *ns) 
{ 
	int nTmp; 
	char welcome[100] = {0};	 
	char send_clientnum[5] = {0}; 
	char buff[1024] = {0}; 
	char temp[1024] = {0}; 
	int retval, i; 
 
	WaitForSingleObject(hMutex,INFINITE);//¹ÂÅØ½º¸¦ ¼ÒÀ¯ÇÏ´Â ¿ªÇÒ. 
	//Á¤»óÀûÀÎ Á¢¼Ó½Ã ½º·¹µå¸¦ ½ÇÇàÇϰí Ŭ¶óÀ̾ðÆ®ÀÇ ¹øÈ£¸¦ Áõ°¡½ÃÅ´ 
	client_num++;			 
	num++;	 
	nTmp = num; 
	printf("Á¢¼Ó °¡´ÉÇÑ Å¬¶óÀ̾ðÆ®ÀÇ ¼ö : %d\n", MAXCLIENT - client_num);	 
	ReleaseMutex(hMutex); 
	 
	itoa(num,welcome,10);	 
	itoa(num,send_clientnum,10); 
	strcat(welcome,msg_client);	 
	 
	retval = send(*(SOCKET*)ns, welcome, sizeof(welcome), 0);	//¼­¹öÁ¢¼Ó ¼º°øÇß´Ù´Â ¸Þ¼¼Áö Àü¼Û 
 
	retval = send(*(SOCKET*)ns, send_clientnum, sizeof(send_clientnum), 0);	//Ŭ¶óÀÌ¾ðÆ® ¹øÈ£ Àü¼Û 
 
	while(retval != SOCKET_ERROR || retval != INVALID_SOCKET) 
	{ 
		recv(*(SOCKET*)ns, temp, 1024, 0);		// µ¥ÀÌÅÍ ¹Þ±â 
		retval = recv(*(SOCKET*)ns, buff, 1024, 0);		// µ¥ÀÌÅÍ ¹Þ±â 
 
		// broadcast ºÎºÐ 
		for(i = 0; i  MAXSOCKETNUM; i++) 
		{	 
			// ¹ÞÀº Ŭ¶óÀÌ¾ðÆ®¿Í º¸³»´Â Ŭ¶óÀ̾ðÆ®ÀÇ ¼ÒÄÏ ¸Þ¸ð¸® ÁÖ¼Ò°¡ ´Ù¸¦¶§¸¸ Àü¼Û 
			WaitForSingleObject(hMutex,INFINITE);		 
			if( ((unsigned*)&client_sock[i] != (SOCKET*)ns)) 
			{ 
				send(client_sock[i], temp, strlen(buff), 0); 
				send(client_sock[i], buff, strlen(buff), 0); 
			} 
			ReleaseMutex(hMutex); 
		} 
		// ¼­¹ö¿¡ µ¥ÀÌÅÍ ¼Û¼ö½Å Á¤º¸¸¦ ±â·Ï 
		 
		if(strlen(buff) != 0) 
		{ 
			printf("%s¹ø Ŭ¶óÀÌ¾ðÆ® >> ", temp); 
			SetColor(nTmp); 
			printf("%s", buff); 
			SetColor(15); 
		} 
		memset(buff, 0, 1024); 
		memset(temp, 0, 1024); 
	} 
 
 
	// Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°á ÇØÁ¦½Ã 
	WaitForSingleObject(hMutex,INFINITE); 
		client_num--; 
	printf("%d Ŭ¶óÀÌ¾ðÆ®°¡ Á¢¼ÓÀ» ²÷¾ú½À´Ï´Ù\nÁ¢¼Ó °¡´ÉÇÑ Å¬¶óÀ̾ðÆ®ÀÇ ¼ö : %d\n", num, MAXCLIENT - client_num); 
	ReleaseMutex(hMutex); 
 
	closesocket(*(int*)ns); 
	 
	return; 
}