udp 통신 질문입니다.

이기문의 이미지

udp 통신 질문입니다.

이건 connection을 만드는 부분이구요..

void makeConnection(char* IPAddress)
{    
    if ((he=gethostbyname(IPAddress)) == NULL) {  /* get the host info */
	herror("gethostbyname");
	exit(1);
    }

    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
	perror("socket");
	exit(1);
    }

    their_addr.sin_family = AF_INET;      /* host byte order */
    their_addr.sin_port = htons(PORT);  /* short, network byte order */
    their_addr.sin_addr = *((struct in_addr *)he->h_addr);
    bzero(&(their_addr.sin_zero), 8);     /* zero the rest of the struct */


    if ((numbytes=sendto(sockfd, "Are you ready?", strlen("Are you ready?"), 0,
			 (struct sockaddr *)&their_addr, sizeof(struct sockaddr))) == -1) {
	perror("sendto");
	exit(1);
    }
    cerr << "sock fd: " << sockfd << endl;
}

이건 클라이언트로 내가 필요한 내용을 보낼떄 호출하는 함수입니다.

void receiveFromClient() 
{    

    if ((numbytes=recvfrom(sockfd, buf, MAXBUFLEN, 0,
			   (struct sockaddr *)&their_addr, addr_len)) == -1) {
	perror("recvfrom");
	exit(1);
    }

    buf[numbytes] = '\0';
    fileSize = atol(buf);
    cout << "Received file size : " << fileSize << " bytes." << endl;

    int bytesReceived = 0;

    while (bytesReceived < fileSize)	{
	if ((numbytes=recvfrom(sockfd, (char *)(&(buf[bytesReceived])), fileSize-bytesReceived, 0,
			       (struct sockaddr *)&their_addr, addr_len)) == -1) {
	    perror("recvfrom");
	    exit(1);
	}
	bytesReceived = bytesReceived + numbytes; 
    }

}

위의 두 함수를 작성하구요..
일단은 첫번째 함수를 불러서 client와의 connection을 만들어놓고..
전송할 내용이 있을떄 두번쨰 함수를 불러서 내용을 전송하고 싶습니다.

참고로

int sockfd;
struct sockaddr_in their_addr;
struct hostent *he;
int numbytes;
socklen_t* addr_len;
char buf[MAXBUFLEN];

이런 녀석들은 모두 전역변수로 선언했습니다.

그런데..

보내려고 두번쨰 함수를 부르면 Bad address 하고 에러가 나는데요..

왜 그런지 조언 부탁드립니다.
감사합니다 ^^

익명 사용자의 이미지

int recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);

fromlen에 들어가는 인자가 일단 잘못 되었군요.

이기문의 이미지

socklen_t* addr_len;

이런 식으로 전역변수로 addr_len을 선언했구요..

int recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);

socklen_t *fromlen 에서 fromlen 자리에 addr_len을 넣었는데..

제가 아직 잘 몰라서.. 좀 더 자세한 설명 부탁드립니다. ^^

그리고.. 위에 두 함수를 붙여서 한개의 함수로 만들어서 하면 되거든요.
왜 그런지 잘 모르겠습니다.
조언 부탁드립니다.

감사합니다 ^^

kslee80의 이미지

fromlen은 포인터 타입이지만,
그렇다고 이 아규먼트가 특정 값을 리턴하기 위해서만 존재하는 아규먼트는 아닙니다.
man 페이지에도 약간의 언급이 있겠지만...
이 아규먼트에는 from 의 크기를 가지는 변수의 포인터가 넘어가야 하죠..

bleu의 이미지

죄송하지만 약간의 확인이 필요할거 같습니다.

혹시 지금 보여 주신부분이 server라는 과정아래에..
client부분에서 sendto로 전달된 메세지가 오는것을
확인은 하신것인지 궁금합니다..

제가 보기엔 sendto 자제도 메세지 전달을 하지 못했을거
같다는 생각에서 말씀을 드리는 것입니다.

혹시 확인 하시고 전달되었다면 제가 잘못 생각한것이겠지만

전달 되지 않았다면

 their_addr.sin_addr = *((struct in_addr *)he->h_addr); 

이부분이 잘못된것 같다는 생각이 불현듯 들어서
말씀드립니다.

추가로

their_addr.sin_addr = (struct in_addr)inet_addr(he->h_addr); 또는 their_addr.sin_addr.s_addr = inet_addr(he->h_addr);

이렇게 수정하시는게 맞지 않을까 합니다..

댓글 달기

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