multithreading network programming - 3. multi client echo server(멀티스레드 네트워크 프로그래밍 - 다중접속 에코서버)


#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);
}
view raw example hosted with ❤ by GitHub

13라인의 idx를 이용해 클라이언트의 번호를 저장합니다. 14라인의 socklist[100]에 클라이언트 정보를 저장합니다.(총 100명) 26번 라인에서 socklist를 전부 -1로 초기화해줍니다. 51,52라인을 통해 클라이언트 소켓을 socklist에 클라이언트 소켓정보를 저장하고 idx의 값을 증가시켜줍니다. 76라인을 통해 클라이언트 소켓이 저장되지 않은 -1이 나올때까지 반복문을 돌리면서 저장된 모든 클라이언트에게 메세지를 전송합니다.

Related Posts: