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<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번라인 반복문 안에서
클라이언트와 지속적으로 통신을 받아서 받은 내용을 돌려주게됩니다.