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;
}