소켓프로그래밍에서 udp 는 bind 안되나요??

dhyoon1의 이미지


자바 udp 소켓 프로그래밍 공부를하고 있는 초보입니다...

//UDP소켓을 생성하고
Socket = new DatagramSocket();

//UDP소켓의 출발지 IP와 PORT를 설정하기 위해 bind
Socket.bind(new InetSocketAddress("192.168.41.181, 56633));

이러면 bind 부분에서 에러가 나네요;;;

원래 UDP 는 bind 함수를 못거는건가요??

답변좀 부탁드립니다 ㅠㅠ

dhyoon1의 이미지


bind 함수가 소켓을 열고 데이터를 보낼때 출발지IP 와 PORT를 설정해주는 함수가 맞나요..?

익명 사용자의 이미지

Bind를 설명하기 전에 TCP와 UDP의 차이점을 알아야 합니다.

TCP/IP 계층에서 보았을 때 TCP와 UDP 모두 transport 계층에 있습니다. 둘 다 동급의 프로토콜로 동일한 기능을 담당한다는 뜻입니다. 같은 기능을 하면 하나만 있으면 될 걸 왜 2개나 존재하는 걸까요?

두 방식에는 큰 차이점이 있기 때문입니다.
연결지항적이냐 비연결지향적이냐 이 차이입니다.
TCP는 연결지향적이므로 안정성과 신뢰성에 기반을 두고 있어 패킷이 전송 도중 손실되었을 경우 재전송을 요청하는 프로토콜이며 UDP는 비연결지향적이므로 그냥 데이터를 전송하기만 합니다. 중간에 손실되든 말든 상관 안 하겠다는 거죠.

좀 비약이긴 하지만 대략 이런 시스템입니다.
이 때문에 TCP는 데이터 통신 전 상대방을 확인하는 절차를 거치게 됩니다. 이 때 세션을 맺어 연결된 세션을 통해서 데이타의 흐름이 이루어지는데 이 과정에서 bind가 필요하게 됩니다.
그 반면 UDP 는 세션을 만들지도 많고 그냥 보내고 받기만을 한다. 그러므로 우리가 UDP 서비스를 하는 서버로 메시지를 보냈다고 하더라도, 메시지가 실제로 도착되었는지는 알수가 없습니다.

이런 이유로 UDP는 bind가 필요하지 않습니다.

gilgil의 이미지

local binding이 되지 않는 이유는 여러가지가 있을 수 있습니다.

1. local ip binding이 안될 때가 있는데 이는 OS의 권한 문제일 수 있음.
2. local port binding이 되지 않는 것은 다른 프로세스가 해당 port를 잡고 있을 수도 있음.
3. 일부 OS에서는 binding 정보가 해당 프로세스가 죽은 이후 시간이 좀 지나야 해제되는 경우도 있음.

자신IP:1111 > 8.8.8.8:2222로 "hello world" 패킷을 보내는 예제입니다. 참고하시기 바랍니다.

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
 
public class Test {
 
	public static void main(String[] args) {
		try {
			String LOCAL_HOST  = InetAddress.getLocalHost().getHostAddress(); // "192.168.245.136";
			int    LOCAL_PORT  = 1111;
			String REMOTE_HOST = "8.8.8.8";
			int    REMOTE_PORT = 2222;
 
			DatagramSocket socket = new DatagramSocket(new InetSocketAddress(LOCAL_HOST, LOCAL_PORT));
			String s = "hello world";
			byte[] buf = s.getBytes();
			InetAddress address = InetAddress.getByName(REMOTE_HOST);
			DatagramPacket packet = new DatagramPacket(buf, buf.length, address, REMOTE_PORT);
			socket.send(packet);
			socket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
 
}

댓글 달기

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