This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include<stdio.h> | |
#include<stdio.h> | |
#include<stdlib.h> | |
#include<string.h> | |
#include<unistd.h> | |
#include<netinet/in.h> | |
#include<sys/socket.h> | |
#include<pthread.h> | |
#define PORT 8091 | |
void* do_echo(void *); | |
int idx = 0; | |
int socklist[100]; | |
int main() | |
{ | |
int connSock, listenSock; | |
struct sockaddr_in s_addr, c_addr; | |
int len; | |
int pthread1; | |
int thr_id; | |
for(idx = 0; idx<100; idx++) | |
socklist[idx]=-1; | |
idx=0; | |
listenSock = socket(PF_INET, SOCK_STREAM, 0); | |
memset(&s_addr, 0, sizeof(s_addr) ); | |
s_addr.sin_addr.s_addr = htonl(INADDR_ANY); | |
s_addr.sin_family = AF_INET; | |
s_addr.sin_port = htons(PORT); | |
if(bind(listenSock, (struct sockaddr *)&s_addr, sizeof(s_addr)) == -1){ | |
printf("Can not Bind\n"); | |
return -1; | |
} | |
if(listen(listenSock, 5) == -1){ | |
printf("listen Fail\n"); | |
return -1; | |
} | |
while(1){ | |
len = sizeof(c_addr); | |
connSock = accept(listenSock, (struct sockaddr *)&c_addr, (socklen_t *)&len); | |
socklist[idx]=connSock; | |
idx++; | |
thr_id = pthread_create((pthread_t *)&pthread1, NULL, do_echo, (void *)connSock); | |
} | |
} | |
void* | |
do_echo(void* data) | |
{ | |
int n; | |
char rcvBuffer[BUFSIZ]; | |
int connSock = (int)data; | |
char str[100]; | |
while((n = read(connSock, rcvBuffer, sizeof(rcvBuffer))) != 0){ | |
idx =0; | |
rcvBuffer[n]='\0'; | |
sprintf(str, "[%d]: %s", connSock, rcvBuffer); | |
while(socklist[idx] != -1){ | |
write(socklist[idx], str, strlen(str)); | |
idx++; | |
} | |
} | |
return (data); | |
} |
13라인의 idx를 이용해 클라이언트의 번호를 저장합니다. 14라인의 socklist[100]에 클라이언트 정보를 저장합니다.(총 100명) 26번 라인에서 socklist를 전부 -1로 초기화해줍니다. 51,52라인을 통해 클라이언트 소켓을 socklist에 클라이언트 소켓정보를 저장하고 idx의 값을 증가시켜줍니다. 76라인을 통해 클라이언트 소켓이 저장되지 않은 -1이 나올때까지 반복문을 돌리면서 저장된 모든 클라이언트에게 메세지를 전송합니다.