multithreading network programming - 2. echo server(멀티스레드 네트워크 프로그래밍 - 에코서버)

간단한 에코서버입니다.


#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 9100
void* do_echo(void *);
main()
{
int connSock, listenSock;
struct sockaddr_in s_addr, c_addr;
int len;
int pthread1;
int thr_id;
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("Cna 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, &len);
thr_id = pthread_create(&pthread1, NULL, do_echo, (void *)connSock);
}
}
void* do_echo(void* data)
{
int n;
char rcvBuffer[BUFSIZ];
int connSock = (int)data;
while((n = read(connSock, rcvBuffer, sizeof(rcvBuffer))) != 0){
write(connSock, rcvBuffer, n);
}
}












41번 라인에서 accept 한 후 리턴받은 connSock의 값을

43번 라인에서 쓰레드를 생성하면서 값으로 넘겨줍니다.

그럼 47번 라인에 생성된 쓰레드 내부의 54번라인 반복문 안에서

클라이언트와 지속적으로 통신을 받아서 받은 내용을 돌려주게됩니다.

Related Posts: