ssl 프로토콜과 소켓 connect..

익명 사용자의 이미지

안녕하세요 컴공과4학년 학생입니다 ^^

10월 2일날 졸업작품 발표회가 있어서..

요새 주욱~ ssl을 건드리고 있는데..

ssl 프로토콜을 기반으로 네떡 플밍을 짜고 있는데..

자꾸만 connect 부분에서 에러가 나네요.

기본 문법은 절대 틀린게 아닌데..

************** 소스부분 *******************
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(MASERVER);
address.sin_port = htons(9338);

if ( init_connection(&ssld, &ssl, &ctx, &address) <0)
{
printf("SSL 연결 불량임ㅡㅡ^\n");
exit(-1);
}

if((socksfd = socket(AF_INET, SOCK_STREAM, 0))<0){
printf("socket 생성 실패ㅡㅡ^\n");
exit(0);
}

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(MASERVER);
serv_addr.sin_port = htons(6666);

if ( connect(socksfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))<0)
{
printf("연결 불량임ㅡㅡ^\n");
exit(-1);
}

********************************************

정말 틀린게 아닌데.. ㅡㅡ^

혹 문법적으로 뭔가 문제가 있는건지..

아님 원래 ssl과 소켓connect를 동시에 연결하는게 안되는건지.. ㅡㅡ;

(아~ ssl 쪽에 있는 connection함수는 제가 따로 만든겁니다. )

알고싶습니다.

익명 사용자의 이미지

흠.. 경우에 따라서는 address 구조를 모두 0으로 초기화 한 후 주소나
포트, 프로토콜을 설정해야 하는 경우도 있지만 이전의 init_connection
()에서 정상처리된 것으로 보아서는(근데 에러가 어디서 난거예여? 저 아
랫쪽 connect 에서 난건가여?) 이 문제는 아닌 듯 하구여,

errno 를 참조해 보세여. exit() 하시기 전에 찍어보시면 왜 에러가 났는
지 아는데 좀 힌트가 될 것 같으니까여..

익명 사용자의 이미지

답변 감사드립니다 _(__)_

저의 질문이 조금 부족한 듯 했었네요..^^

님의 말씀처럼 errno를 찍어봤더니

84번이 나오네요....

--> 84 부적절하거나 불완전한 다중바이트 또는 광역 문자

라고 하는데...

SSL연결은 잘 되었는데..

그 밑의 소켓connect가 연결되지 않는 것입니다.

특정포트를 사용해야 하거나.. 뭐 그런 제약같은게 있는건가요?

익명 사용자의 이미지


흠..

84번 오류(아마 리눅스에서 수행하셨나봐요?)는
connect에서 발생하는 오류가 아닌 듯 한데 발생한 것이 좀 이상하네요.

client socket 만들어서 connect 하는데는 별 문제없어보이거든요.

serv_addr.sin_family = AF_INET;
문장 전에
memset(&serv_addr, 0, sizeof(serv_addr));
printf("errno %d\n", errno);
를 한번 추가해서 수행해 봐주실래요?

errno는 connect 들어가기 전에 한번 더 수행해 봐 주시고요.

혹시 multi-threaded 인 경우에는 컴파일시 -D_REENTRANT 를
지정해 주셨는지도 한번 확인해 주시고요.

수고하세요,,

익명 사용자의 이미지

님이 말씀하신 대로 해보니까.

**** 결과값 *****
[root@bridge nids]# ./ids
SSL connection using DES-CBC3-MD5
SSL 연결 성공~ (<-그냥 printf한것)
errno 0
errno 0

errno 111 (<-connect함수 바로 밑에 했음.. )
연결 불량임ㅡㅡ^

*****************************************************

이런식으로 나오네요.. 앞에 둘은 성공했는데.. ㅤ^^;;

errno가 다시 바뀌었네요.. ㅡㅡ^ 이런..

으~ 해결됐음 좋겠는데..

안되니 꽤나 답답하네요 ^^;

익명 사용자의 이미지


리눅스의 111번 오류 ECONNREFUSED 네요.
man 에서 보신대로 그쪽 port를 listen하고 있는 서비스가
없기 때문에 발생하거든요. 즉, 서버장비쪽에서 6666 번에 붙어서
서비스를 해 주는 프로세스가 안 뜬거죠.

실제로 그 장비에 telnet 등으로 들어가셔서
ps등으로 프로세스를 확인해 보시고요, 프로세스가 떠 있다고 하면
netstat -an | grep 6666 을 해봐서
.... LISTEN
이라는 것이 있는지 확인해 보시고, (아마 없을 것입니다.)
없으면 6666 번 포트를 서비스해줘야 하는 프로그램을
trace 해 보도록 하세요.

수고하세요,,