728x90
Iterative 서버
- 다수의 클라이언트에 서비스를 제공할 수 있는 서버
- 접속한 클라이언트의 소켓을 close 후 다시 accept하여 다른 클라이언트와 연결해 데이터를 송수신하는 구조
- 1:N으로 통신할 수는 없음
- close 후 다시 accpet를 호출하여 다른 클라이언트의 연결을 받음
-> 서버 코드
int main(int argc, char *argv[])
{
serv_sock=socket(PF_INET, SOCK_STREAM, 0);
if(bind(serv_sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1) {
printf("bind() error");
}
if(listen(serv_sock, 5)==-1) {
printf("listen() error");
}
clnt_adr_sz=sizeof(clnt_adr);
for(i=0; i<5; i++)
{
clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_adr, &clnt_adr_sz);
if(clnt_sock==-1) {
printf("accept() error");
}
else {
printf("Connected client %d \n", i+1);
}
while((str_len=read(clnt_sock, message, BUF_SIZE))!=0) {
write(clnt_sock, message, str_len);
}
close(clnt_sock);
}
close(serv_sock);
return 0;
}
-> 클라이언트 코드
int main(int argc, char *argv[])
{
...
sock=socket(PF_INET, SOCK_STREAM, 0);
...
if(connect(sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1) {
printf("connect() error!");
}
else {
printf("Connected...........");
}
while(1)
{
fputs("Input message(Q to quit): ", stdout);
fgets(message, BUF_SIZE, stdin);
if(!strcmp(message,"q\n") || !strcmp(message,"Q\n")) {
break;
}
write(sock, message, strlen(message));
str_len=read(sock, message, BUF_SIZE-1);
message[str_len]=0;
printf("Message from server: %s", message);
}
close(sock);
return 0;
}
728x90
'Programming > Network' 카테고리의 다른 글
열혈 TCP/IP 05-2. TCP의 이론적인 이야기 (0) | 2021.02.14 |
---|---|
열혈 TCP/IP 05-1. 에코 클라이언트 (0) | 2021.02.14 |
열혈 TCP/IP 04-2. TCP 기반 서버와 클라이언트의 구현 (0) | 2021.02.14 |
열혈 TCP/IP 04-1. TCP와 UDP에 대한 이해 (0) | 2021.02.14 |
열혈 TCP/IP 03-4. 인터넷 주소의 초기화와 할당 (0) | 2021.02.09 |