소켓통신에서 read함수 문제인데요. 정말 왜 그런지 도통 모르겠네요 시리얼 통신과의 차이점이랄까요?

LaSeine의 이미지

개발 환경은 리눅스에서 C언어로 합니다.

소켓 통신에서

서버와 클라이언트를 짜서 데이터 주고 받는 프로그램을 작성했는데요.

클라이언트에서 서버쪽으로 데이터를 날리게 됩니다.

그럼 서버에서는 데이터를 받고 응답을 내려 주는 프로그램입니다.

물론 서버에서 정상적으로 모든 데이터를 받았을 경우에 한해서 클라이언트 쪽으로 응답을 주게 됩니다.

클라이언트 프로그램에서 상대방의 아이피 주소를 버퍼에 같이 실어서 보내주는데요. 실행은 ./client 127.0.0.1 7777

이런식으로 실행하며 저위에 보이는 아이피 주소를 버퍼에 '.'을 기준으로 토큰으로 나눠 버퍼에 담아서

서버로 보냅니다. 그럼 127.0.0.1에서 숫자 0이 버퍼에 담기는데요.

저 0을 서버에서 널문자로 인식하고 뒤에 문자가 더 있음에도 끝까지 데이터를 받지않고 중간에 멈춰 버립니다.

데이터는 1바이트씩 받으며 서버쪽에서 받는 소스는

서버 데이터 받는 부분

char receive = 0;
char receiveBuff[1024] = 0;
int ret = 0;
while(1)
{
ret = read(clnt, &receive, 1);
if(!ret) break;
else
{
receiveBuff[i++] = receive;
}
}
위와 같습니다.

시리얼 통신할때는 0을 보내도 널로 인식 하지않고 숫자 0으로 인식 하는지 뒤에 데이터도 잘 받았는데

소켓 통신을 할때는 이상하게 0을 보내면 널문자로 인식하는지 뒤에 데이터를 받지 않습니다.

어떤 이유에서인가요?

익명 사용자의 이미지

0==NULL==FALSE==false

익명 사용자의 이미지

0==NULL==FALSE==false

익명 사용자의 이미지

전송코드는 어떻게 되나요?

TCP연결에서는 0값('0'하고는 다르죠)을 전송하는 경우를 연결종료로 처리합니다.

보통 연결종료 시나리오는

1. select등으로 해당 fd에 read이벤트 발생
2. read하였으나 received byte가 0
3. 수신측에서는 해당 rx가 종료된것으로 판단. tx의 종료는 application의 영역

mhhong의 이미지

프로토콜을 정해서 사용 해보세요.
보통 해더 + 데이터 방식으로 송.수신을 합니다.
해더 사이즈는 고정을 하고 해더 안에 데이터 사이즈, 기타 정보 등을 정의 합니다.
해더가 8바이트면 우선 8바이트를 먼저 받고 해더를 파싱해서 데이터 사이즈를 알아내 데이터를 받으면 됩니다.
1바이트를 받기 위해 매번 I/O 함수를 호출하는 것은 매우 비효율적입니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.