소켓통신에서..

ymkim00의 이미지

소켓통신을 하는데 문제가 있어 질문을 드립니다.
고수님들의 도움이 필요합니다..^^

    unsigned char ret_buffer[52];
    unsigned int len = sizeof(ret_buffer);
    int result,i;

    if(sockfd == -1) 
    {
    }
    else
    {
	    result = send(sockfd,ret_buffer, len, 0);
	    if(result < 0) sock_init = 1;
    }
    

간단하게 이렇게 구성을 했을때..
ret_buffer배열 중간에 NUL이 존재합니다. 그러다 보니..
NUL이후의 데이터들은 전송이 안됩니다.
NUL과 그 이후의 데이터를 모두 전송하는 방법은 없는건가요?
며칠째 씨름하고 있는데 답이 안나옵니다.

도와주세요요요^^

하하의 이미지

음.. 제가 알고 있는 바로는

NUL값에 상관없이 지정한 size만큼 데이터를 보내

는걸로 알고 있습니다.

실제 소스를 올려주시면 .. 좀더 정확히 알 수 있을거

같습니다.

“바람에게도 길은 있다. 나는 비로소 나의 길을 가느니. 길은 언제나 어디에나 있다.”

서지훈의 이미지

그렇다면...
write() 함수를 한 번 사용해 보세요.
이건 무조건 지정한 양 만큼 보내주게 됩니다.
근데... send()는 저도 한 번도 사용을 안해봐서 잘 모르겠지만...
지정한 만큼 갈거 같은데...-_-ㅋ

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

espereto의 이미지

send는 지정된 크기만큼 전송하는 걸 보장하지 않습니다. send로 데이터를 보낼 때, 얼마나 보냈는지가 리턴되므로 이걸 이용해 원하는 양이 모두 전송될때까지 루프를 돌리거나 해야 합니다.

ifyou의 이미지

요즘 좀 바쁘다 보니 두번씩이나 잘못된 답변 달았네요.. :lol:

잘못 된 답변은 삭제했고....

위분 말씀들 다 맞고..

그리고, send()했을 경우 한번에 다 전송된다는 보장 없는 것은

사실이지마, 왠만하면 한번에 다 전송됩니다. 데이터가 너무 크다던지,

네트웍 환경이 너무 좋지 않아던지.. 하는 것만 아니라면..

원하는 만큼 전송이 안되는 것은 어떻게 확인하셨는지요?

send()의 return 값으로? 아니면, 상대측 recv()의 return 값으로?

불량청년의 이미지

송신측에선 데이터를 보내기 전에 데이터의 싸이즈를 구해서 보낸후에

데이터를 전송하게 하구요.

수신측에선 싸이즈를 받아서 그만큼 루프를 돌려 받으면 됨니다.

일단 데이터 싸이즈 받는 버퍼의 크기는 송.수신측 모두 동일 해야 겠구요.

H/W가 컴퓨터의 심장이라면 S/W는 컴퓨터의 영혼이다!

moonzoo의 이미지

send 를 써서 보낼때 NULL 값인 것과는 상관없습니다.

데이타에 NULL값이 들어가서 못보낸 것이 아니라..

혹시 받는 쪽에서 NULL을 처리 못하는 건 아닌지 확인할

필요가 있겠습니다.

send의 리턴값을 꼭 확인하셔서 몇 바이트 보냈는지도

확인이 필요합니다.

최병현의 이미지

ymkim00 wrote:
소켓통신을 하는데 문제가 있어 질문을 드립니다.
고수님들의 도움이 필요합니다..^^

    unsigned char ret_buffer[52];
    unsigned int len = sizeof(ret_buffer);
    int result,i;

    if(sockfd == -1) 
    {
    }
    else
    {
	    result = send(sockfd,ret_buffer, len, 0);
	    if(result < 0) sock_init = 1;
    }
    

간단하게 이렇게 구성을 했을때..
ret_buffer배열 중간에 NUL이 존재합니다. 그러다 보니..
NUL이후의 데이터들은 전송이 안됩니다.
NUL과 그 이후의 데이터를 모두 전송하는 방법은 없는건가요?
며칠째 씨름하고 있는데 답이 안나옵니다.

도와주세요요요^^

이상하군요. NULL 자체도 데이터이기 때문에 전달되어야 하는 것이 맞을 것 같은데...

혹시 수신측에서 데이터를 char*로 사용하거나 혹은 그와 관련된 어떤 함수로 처리를 하시는 것인지 확인해 보시기 바랍니다.

또, 송신측은 다음과 비슷하게 수정 하시는 것이 좋을 것 같습니다.

int BytesLeft = 0;
int BytesSent = 0;
unsigned char ret_buffer[52];
unsigend char *Data  = NULL;

Data = ret_buffer;
BytesLeft = sizeof(ret_buffer);

while( BytesLeft > 0 ) {
    BytesSent = send(sockfd,data, BytesLeft, 0);
    BytesLeft -= BytesSent;
    Data       += BytesSent;
}

socket 관련 에러 처리는 적지 않았습니다.
위와 비슷하게 처리해야 원하는 크기의 data를 전송하는 것을 보장할 수 있습니다.

To be a rich

댓글 달기

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