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

+ Recent posts