본문 바로가기
Programming/llnux

tcp/ip 소켓 프로그래밍.우아한 종료.

by 기적 2011. 9. 1.

half-close를 해야하는 이유?
소켓은 반만 닫힌다?
스트림가 생기게 되면 한방향으로만 생기는것이 아니고 양쪽으로 생긴다. 그래서 반만 닫힌다고 생각하면 된다. close함수호출을 통해서 스트림을 종료하게 되면 문자열을 수신할수 없다.
소스이야기.
책에 있는 소스를 이야기하면
처음 기본적인 해더들을 추가하고 항상 써왓듯이 에러핸들링 함수를 써주엇다.
간단한 메인 문에서는 파일에 써야할 파일 포인터 하나와 핸들링 변수 2개를 선언을 해주고 문자열을 저장할 buf를 써주고 또 fread함수를 사용했을때, 읽어온 파일의 크기를 저장할 변수 read_cnt라는 변수를 지정하였다.
server에서는 매번해왔듯이 주소정보를 저장하는serv_adr을 써주었고 fp파일포인터로  내가 코드작성할때 썻던 서버 c코드를 읽어와fp파일 포인터에 핸들링을 할수 있도록 하엿고 serv_sd는 소켓을 생성하고 핸들링 할수있게 해주었다.
그리고 바인드를 해주어서 주소정보를 소켓에 할당해주었다. listen함수로 연결요청 대기상태로 하고, 연결요청을 확인해주는 함수를써준다.그리고 반복문으로 들어가서 파일을 일어온뒤 write함수로 파일을 읽어와 버퍼에 넣어준다. 모두 읽어온뒤.shutdown함수로 half-close를 해준다. 그리고 read함수를 사용해서 클라이언트에서 오는 내용을 써준다. 메시지를 출력하고, 모든 열린것들에 대해서 닫아준다.

클라이언트의 경우에는 마찬가지로 기본적인 변수들은 비슷하다.
일단 파일을 오픈하여 파일이름을 써주고,소켓을 생성한다. 그리고 주소정보를 입력해주고, connect함수를 이용하여 서버에 접속을 한다. 그러면 서버는 클라이언트의 주소정보를 받고 accept를 하게 될것이다.
그리고 클라이언트에선 서버에서 내용을 모두 받아와서 버퍼에 입력해서 0을 리턴받으면 fwrite를 사용하여 파일에 직접 입력을 하게되고 fclose를 사용하여 파일을 닫고 열엇던 소켓도 닫는다.

이렇게 주저리 주저리 썻다;

이야기 하는 식으로 써야겟다.

댓글