socket udp port문제 질문드립니다.

삼구의신의 이미지

linux udp 를 사용 중입니다.

udp sendto 할때 20000번 포트로 설정해서 전송한 것을 tcpdump로 확인하면 다른 포트로 전송되고 있습니다.
하지만 받는 쪽에선 20000번 포트로 제대로 들어오구요... 이건 왜그럴가요?

tcpdump 캡쳐 드립니다. 데이터도 깨지지않고 정상적으로 들어옵니다. 저는 분명 20000번 포트로 전송했는데
아래 tcp dump에선 43777포에서 보낸다고 나옵니다. 하지만 해당 장비에는 20000번 포트로 전동되네요..

송신측 : A에서 B로 전송할 때
12.31.240.240.43777 > 12.17.0.64.20000: [udp sum ok] UDP, length 17

수신측 : B에서 Data를 받았을 때
12.31.240.240.42042 > 12.17.0.64.20000: [udp sum ok] UDP, length 17

A라는 장비에서 20000 포트로 data를 전송하려고하면 송신할때 포트번호가 바뀝니다. 왜그런지 아시는분 있나요?

조언 부탁드립니다.

udp send 부분 입니다.

	int sock;
    struct sockaddr_in sin;
 
    if ((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket init error :");
		return ;
    }
 
    memset(&sin, 0, sizeof sin);
 
    sin.sin_family = PF_INET;
    sin.sin_addr.s_addr = inet_addr(ipAddr.c_str()); // 12.17.0.64
    sin.sin_port = htons(port); // 20000
 
	if( sendto( sock, data, dataSize, 0,( struct sockaddr*)&sin, sizeof( sin)) != dataSize)          
	{
		printf("Mismatch in number of sent bytes");
	}
 
   close( sock);
익명 사용자의 이미지

송신측 : A에서 B로 전송할 때
12.31.240.240.43777 > 12.17.0.64.20000: [udp sum ok] UDP, length 17

수신측 : B에서 Data를 받았을 때
12.31.240.240.42042 > 12.17.0.64.20000: [udp sum ok] UDP, length 17

20000포트로 잘 보내고 있는데요?

우편을 부쳐 보셨으면 아시겠지만 받는 사람 주소뿐만 아니라 보내는 사람 주소도 적기 마련입니다.
43777(및 42042)은 보내는 쪽 포트번호입니다.

삼구의신의 이미지

받는 측에서 20000 포트로 잘 들어오지만, 보낸 사람의 포트는 42042 같이 랜덤으로 바뀌는 현상이 문제입니다.
수신측에서 송신자의 포트번호를 가져와 loopback 해줘야하는데 포트번호가 마음대로 바뀌니 데이터를 제대로 받을수가 없습니다.

제가 하고싶은것은

12.31.240.240.20000 -> 12.17.0.64.20000 이렇게 가도록 하고싶은것 입니다.

라스코니의 이미지

구글에서 socket bind port 로 검색해 보세요. 결론은 원하는 port 번호를 가지고 생성한 소켓을 bind() 함수로 묶어 주시면 됩니다.

익명 사용자의 이미지

왜 꼭 그래야만 하는지는 알 수 없지만, (수신측에서 송신자의 포트번호를 알고 싶다면, recvform 함수를 호출하면서 src_addr를 받으면 됩니다: https://linux.die.net/man/2/recvfrom) 송신측의 포트도 원하는 대로 지정하고 싶다면 sock을 sendto 전에 미리 bind 하면 됩니다.

삼구의신의 이미지

감사합니다^^

댓글 달기

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