기초 소켓프로그래밍 질문입니다.^^

dux의 이미지

간단하게 소켓프로그래밍을 해보고 있는데요..
서버는 누군가 벌써 작성해 놓으셨구요..
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는 서버로 무작정 데이터를 보내는 것이라서 그런 것인가요?)

한마디로 말하면 제가 프로그램을 잘못 짠 것 같은데 경험 많으신 분들께서는 바로 위의 서버의 정보를 본 후에 어떻게 프로그램을 작성할지 알려 주시면 정말 감사드리겠습니다.
그럼 고운 하루되세요~

vness의 이미지

telnet으로 전달한다는 의미가 명령어를 보내고 enter 친다는 의미처럼 들리는데 이거 맞나요?

그렇다면..

write(sockfd, cmd, 255); 
write(sockfd, cmd2, 255);

부분에서 cmd와 cmd2에 들어있는 명령어의 끝에 각각 '\n'을 붙여서 전송하시고 길이도 255만큼을 보낼 것이 아니라 정확한 cmd와 cmd2의 길이 만큼을 보내야 합니다.

vinus의 이미지

명령어의 끝에 각각 '\n'을 붙여서 전송하시고

'\r\n' 이 더 타당하지 않을까요?

타임아웃을 걸어주는 것이 현명하리라 생각 합니다.
select 라는 적당한 함수가 있습니다.

>>>행복한 웃음<<<

vness의 이미지

window platform의 enter key와 unix/linux platform의 enter key..

어느쪽이 더 타당하다고 할 수 있는 문제는 아닌 것 같은데요. -_-a;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.