기초 소켓프로그래밍 질문입니다.^^
간단하게 소켓프로그래밍을 해보고 있는데요..
서버는 누군가 벌써 작성해 놓으셨구요..
nmap으로 확인해보면 제가 접속해야 할 포트가 tcp로 열려 있는 것을 확인 할 수 있습니다.
그리고 telnet 으로 해당포트에 접속해서 명령어를 내리면 매우 잘 됩니다.
그 명령어 라는 것이 단 두줄인데..
그래서 이전에 소켓프로그래밍을 해 본 경험을 살려서 해당 포트에 tcp로 연결을 한 다음에 write()로 두줄의 명령어를 전송시키면 될 것이라고 생각 했습니다.(두줄의 명령어라는 것은 wirte()를 두번 한다는 뜻입니다.)
해당서버는 잘못된 명령을 내리면 자동으로 연결을 끊어버립니다.(telnet에서 잘못된 명령어를 치는 순간 연결을 끊어버리더군요)
그런데, 제대로된 명령어를 전달하든, 이상한 명령어를 전달하든 서버에서 어떤 일이 발생했는지, 명령이 전달되었는지 알수가 없습니다.-_-;;
제대로 된 명령어를 write()로 보낸 후에 200 ok가 떨어지면 recv()로 받으려고 생각했는데, recv() 부분에서 멈춰버리더군요-
소스의 구성은
write(sockfd, cmd, 255); write(sockfd, cmd2, 255); if(read(sockfd, buf_get, 255) == -1) { printf("error-_-\n"); exit(1); }
이런 식으로 매우 간단하게 되어 있습니다.-_-
그런데 언제나 항상! read()에서 그냥 멈춰 버립니다.ㅠㅠ
무슨 에러라도 내면 좋으련만 error-_- 이라는 것도 출력이 되지 않습니다.
그냥 가만히 있죠.
서버의 정보를 말씀드리자면 telnet으로 해당 포트에 연결하면 처음에 아무 메세지도 나오지 않고, 그냥 프롬프트만 깜빡거립니다.
거기서 잘못된 명령어를 전달하면 자동으로 그 연결이 끊어지고 텔넷도 종료되구요..
제대로 된 명령어를 전달하면 200 ok를 반환 한 후 연결이 바로 끊어집니다.
제가 서버의 소스코드를 본다던지, 서버로 직접 접속해서 패킷을 확인한다든지 하는 것은 불가능한 상태이구요..
그렇다면 write로 잘못된 명령어를 전달했을 때는 뭔가 에러가 나든지 접속이 끊겨야 할텐데 두번째 write도 잘 되는 것 같습니다.-_-;;(그냥 write는 서버로 무작정 데이터를 보내는 것이라서 그런 것인가요?)
한마디로 말하면 제가 프로그램을 잘못 짠 것 같은데 경험 많으신 분들께서는 바로 위의 서버의 정보를 본 후에 어떻게 프로그램을 작성할지 알려 주시면 정말 감사드리겠습니다.
그럼 고운 하루되세요~
telnet으로 전달한다는 의미가 명령어를 보내고 enter 친다는 의미
telnet으로 전달한다는 의미가 명령어를 보내고 enter 친다는 의미처럼 들리는데 이거 맞나요?
그렇다면..
부분에서 cmd와 cmd2에 들어있는 명령어의 끝에 각각 '\n'을 붙여서 전송하시고 길이도 255만큼을 보낼 것이 아니라 정확한 cmd와 cmd2의 길이 만큼을 보내야 합니다.
[code:1]명령어의 끝에 각각 '\n'을 붙여서 전송하시고[/code
명령어의 끝에 각각 '\n'을 붙여서 전송하시고
'\r\n' 이 더 타당하지 않을까요?
타임아웃을 걸어주는 것이 현명하리라 생각 합니다.
select 라는 적당한 함수가 있습니다.
>>>행복한 웃음<<<
window platform의 enter key와 unix/linux p
window platform의 enter key와 unix/linux platform의 enter key..
어느쪽이 더 타당하다고 할 수 있는 문제는 아닌 것 같은데요. -_-a;
댓글 달기