728x90
스트림 종료 시 half-close가 되지 않는 이유
int main(int argc, char *argv[])
{
int sock;
char message[BUF_SIZE];
int str_len;
struct sockaddr_in serv_adr;
FILE * readfp;
FILE * writefp;
sock=socket(PF_INET, SOCK_STREAM, 0);
...;
readfp=fdopen(sock, "r"); // fd -> FILE*
writefp=fdopen(sock, "w"); // fd -> FILE*
}
while(1)
{
fputs("Input message(Q to quit): ", stdout);
fgets(message, BUF_SIZE, stdin);
if(!strcmp(message,"q\n") || !strcmp(message,"Q\n")) {
break;
}
fputs(message, writefp); // 전송
fflush(writefp); // 버퍼 비움
fgets(message, BUF_SIZE, readfp); // 수신
printf("Message from server: %s", message);
}
fclose(writefp);
fclose(readfp);
return 0;
}
- 위 문제를 해결하기 위해서 파일 디스크립터를 복사하고 각각에 FILE*를 연결하면 소멸 시 해당 파일 디스크립터만 소멸
파일 디스크립터의 복사
- dup, dup2 : 성공 시 복사된 파일 디스크립터, 실패 시 -1 반환
-> dup2는 복사된 파일 디스크립터의 번호를 지정할 수 있음
#include <unistd.h>
int dup(int fildes);
int dup2(int fildes, int fildes2);
int main(int argc, char *argv[])
{
int serv_sock, clnt_sock;
FILE * readfp;
FILE * writefp;
...;
serv_sock=socket(PF_INET, SOCK_STREAM, 0);
...;
readfp=fdopen(clnt_sock, "r");
writefp=fdopen(dup(clnt_sock), "w"); // fd 복사
fputs("FROM SERVER: Hi~ client? \n", writefp);
fputs("I love all of the world \n", writefp);
fputs("You are awesome! \n", writefp);
fflush(writefp);
shutdown(fileno(writefp), SHUT_WR); // half-close
fclose(writefp);
fgets(buf, sizeof(buf), readfp); fputs(buf, stdout);
fclose(readfp);
return 0;
}
728x90
'Programming > Network' 카테고리의 다른 글
열혈 TCP/IP 17-2. 레벨 트리거와 엣지 트리거 (0) | 2021.03.28 |
---|---|
열혈 TCP/IP 17-1. epoll의 이해와 활용 (0) | 2021.03.28 |
열혈 TCP/IP 16-1. 입력 / 출력 스트림의 분리 (0) | 2021.03.28 |
열혈 TCP/IP 15-3. 소켓 기반에서의 표준 입출력 함수 사용 (0) | 2021.03.28 |
열혈 TCP/IP 15-2. 표준 입출력 함수 사용 (0) | 2021.03.28 |