getpeername() 에 대해 질문 좀 드리겠습니다.
안녕하세요
FTP 데몬을 수정후 포팅하던중 문제가 발생을해서 질문을 드리고 있습니다.
제가 수정한 FTP 데몬의 경우 main에서 바로 getpeername()를 사용을 해서 접속한 사용자 정보를 확인하는데요
리눅스에서는 정상적으로 사용이 되었지만 선솔라리스 5.9환경에서 포팅을 하는데요
if (getpeername(0, (struct sockaddr *)&his_addr, &addrlen) < 0) { syslog(LOG_ERR, "getpeername (%s): %m",argv[0]); exit(1); }
getpeername 함수를 호출한 이후 his_addr 의 값을 리눅스와 유닉스를 구분해서 찍어봤습니다.
리눅스 his_addr.port[7457] his_addr.sin_addr.s_addr[-503207744] his_addr.sin_famly[2] 유닉스 his_addr.port[8466] his_addr.sin_addr.s_addr[0] his_addr.sin_famly[26]
유닉스 상에서는 주소가 저장이 되질 않습니다.
FTP 데몬에서는 getsockname도 호출을 하게되는데 유닉스 상에서는 his_addr.port[8466] his_addr.sin_addr.s_addr[0] his_addr.sin_famly[26]
리눅스에서는 getpeername()이나 getsockname() 모두 유닉스 상에서는 his_addr.sin_addr.s_addr[0]으로 셋팅이 됩니다.
유닉스상에서는 getpeername()를 호출하면 his_addr.sin_addr.s_addr[0]가 셋팅이 되질 않는가해서 일반적인 TCP/IP 테스트 페이지(유닉스 서버, 윈도우 클라이언트)를 만들어봤습니다.윈도우 클라이언트가 접속을 하면 accept하고 바로 getpeername()를 호출했습니다.
getpeername(clnt_sock, struct sockaddr *)&his_addr, &addrlen) < 0) { 결과 clnt_addr2.sin_family[2] clnt_addr2.sin_port[11588] clnt_addr2.sin_addr.s_addr[-1062731294]
정상적으로 동작을 합니다.
제가 추축하는 부분은 FTP 데몬에서 getpeername(0, ...파일디스크립터를 0으로 해서 표준 입력에 되어있는데 이것때문인지 모르겠네요
표준 입력으로 요청이 들어온게 리눅스에서는 안그렇지만 유닉스 상에서는 어떠한 문제로 인해 주소를 읽어 들이지 않는다. 라고 생각이 듭니다..
또한 sin_family가 26으로 들어오는걸로 봐서 클라이언트의 주소 체계가 AF_INET6으로 되어있습니다.
이또한 리눅스와 유닉스에서 다른점이고 유닉스상에서도 표준입력이 아닌 클라이언트 socket으로 읽어들일때랑 다른점이네요
혼란스럽습니다. 이2가지 문제는 왜생길까요
포팅이기에 어떻게 고쳐야 하는데 getpeername()로 IP를 읽어 들이지 못하면 문제가 발생을 하는데 다른 방법을 생각해 봐야할거 같네요
댓글 달기