UDP 점대 점 통신, 방송 통신, 멀티캐스트 통신

IP 주소 의 소개: IP 주 소 는 32 비트 바 이 너 리 로 구성 되 어 있 습 니 다. 네트워크 번호 + 호스트 번호 입 니 다.같은 물리 적 네트워크 에 있 는 모든 호스트 는 같은 네트워크 ID 를 사용 합 니 다. 네트워크 에 있 는 호스트 (네트워크 에 있 는 워크스테이션, 서버 와 공유 기 등 포함) 는 호스트 ID 와 대응 합 니 다.IP 주 소 는 A, B, C, D, E5 종류 로 나 뉜 다.상용 하 는 것 은 B 와 C 두 종류 다.하나의 A 클래스 IP 주 소 는 IP 주소 의 4 단 번호 중 1 단 번 호 는 네트워크 번호 이 고 나머지 3 단 번 호 는 로 컬 컴퓨터 의 번 호 를 말한다.IP 주 소 를 바 이 너 리 로 표시 하면 A 클래스 IP 주 소 는 1 바이트 의 네트워크 주소 와 3 바이트 호스트 주소 로 구성 되 며 네트워크 주소 의 최고 위 치 는 '0' 이 어야 합 니 다.하나의 B 클래스 IP 주 소 는 IP 주소 의 4 단 번호 중 앞의 2 단 번 호 는 네트워크 번호 이다.IP 주 소 를 바 이 너 리 로 표시 하면 B 클래스 IP 주 소 는 2 바이트 의 네트워크 주소 와 2 바이트 호스트 주소 로 구성 되 며 네트워크 주소 의 최고 위 치 는 '10' 이 어야 합 니 다.하나의 C 클래스 IP 주 소 는 IP 주소 의 4 단 번호 중 앞의 3 단 번 호 는 네트워크 번호 이 고 나머지 1 단 번 호 는 로 컬 컴퓨터 의 번 호 를 말한다.IP 주 소 를 바 이 너 리 로 표시 하면 C 클래스 IP 주 소 는 3 바이트 의 네트워크 주소 와 1 바이트 호스트 주소 로 구성 되 며 네트워크 주소 의 최고 위 는 '110' 이 어야 합 니 다.C 류 IP 주소 의 서브 넷 마스크 는 255.255.255.255.0 이 고 각 네트워크 가 지원 하 는 최대 호스트 수 는 256 - 2 = 254 대 입 니 다.
D 클래스 IP 주소: 1110  +멀티캐스트 주소    즉, 멀티캐스트 주소 범위: 224.0.0.1 - 239.255.255.255
전체 0 또는 전체 1 의 네트워크 번호, 호스트 번 호 는 특수 용도 로 유지 합 니 다.
네트워크 번호
호스트 번호
대표
완전무결 하 다
완전무결 하 다
이 네트워크 의 호스트
완전무결 하 다
host-id
이 네트워크 의 호스트 번호 가 host - id 인 호스트
net-id
완비 하 다
호스트 에 할당 되 지 않 고 네트워크 주 소 를 표시 합 니 다. 네트워크 주 소 는 네트워크 를 대표 합 니 다.
완비 하 다
완비 하 다
이 네트워크 의 모든 호스트 를 로 컬 네트워크 의 방송 주소 로 표시 합 니 다.
net-id
완비 하 다
net - id 네트워크 의 모든 호스트 를 방송 하 는 원 격 네트워크 의 방송 주소 입 니 다.
/**********************************************************************
* Compiler: GCC
* Last Update:  Sat 12 Nov 2011 11:52:25 PM CST
* File Name: myServerUDP1.c
* Description: UDP         ,       PORT
* Usage: ./mySErverUDP1         IP      
************************************************************************/

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define MAXBUF 1024
#define PORT 60000
 
int main(int argc, char **argv)
{
    int myFd, clientFd;
    struct sockaddr_in myAddr, clientAddr;
    int addrlen = sizeof(clientAddr);
    char buf[MAXBUF];
    char addrTemp[INET_ADDRSTRLEN];

    bzero(&myAddr, sizeof(myAddr));
    bzero(&clientAddr, sizeof(clientAddr));
    //     ,datagrams
    if((myFd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        printf("   :%d, %s
", errno, strerror(errno));         exit(errno);     }     myAddr.sin_family  = AF_INET;     if (argc == 2) {  //IP         int res;         if ((res = inet_pton(AF_INET, argv[1], &myAddr.sin_addr)) == -1) {             printf(" :%d, %s
", errno, strerror(errno));             exit(errno);         } else if(res == 0) {             printf("IP
");             return 0;         }     } else {         myAddr.sin_addr.s_addr = INADDR_ANY;     }     if (argc == 3) {         myAddr.sin_port = htons(atoi(argv[2]));     } else {         myAddr.sin_port = htons(PORT);     }     if(bind(myFd, (struct sockaddr *)&myAddr, sizeof(myAddr)) != 0) {         printf(" :%d, %s
", errno, strerror(errno));         exit(errno);     }     printf(" , .....
");     while (1) {         bzero(buf, sizeof(buf));         if (recvfrom(myFd, buf, sizeof(buf) - 1, 0,                     (struct sockaddr *)&clientAddr, &addrlen) == -1) {             printf(" :%d, %s
", errno, strerror(errno));             exit(errno);         }         printf(" %s :%s
",                 inet_ntop(AF_INET, &clientAddr.sin_addr, addrTemp, sizeof(addrTemp)), buf);     }     return 0; }
/**********************************************************************
* Compiler: GCC
* Last Update:  Sat 12 Nov 2011 11:39:22 PM CST
* File Name: myClientUDP1.c
* Description: UDP           ,      PORT
* Usage: ./myClientUDP1    IP      
************************************************************************/

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define MAXBUF 1024
#define PORT 60000
 
int main(int argc, char **argv)
{
    int myFd;
    struct sockaddr_in serverAddr;
    int addrlen = sizeof(serverAddr);
    char buf[MAXBUF];

    bzero(&serverAddr, sizeof(serverAddr));
    bzero(buf, sizeof(buf));
    //     ,datagrams
    if((myFd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        printf("socket()   :%d, %s
", errno, strerror(errno));         exit(errno);     }     /* , , */     int yes = 1;     if(setsockopt(myFd, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(yes)) != 0) {         printf("setsockopt() :%d, %s
", errno, strerror(errno));         exit(errno);     }     // IP ;     serverAddr.sin_family  = AF_INET;     if (argc > 1) {  //IP         int res;         if ((res = inet_pton(AF_INET, argv[1], &serverAddr.sin_addr)) == -1) {             printf("inet_pton() :%d, %s
", errno, strerror(errno));             exit(errno);         } else if(res == 0) {             printf("IP
");             return 0;         }     } else {         printf("Usage: %s IP
", argv[0]);         return 0;     }     if (argc == 3) {         serverAddr.sin_port = htons(atoi(argv[2]));     } else {         serverAddr.sin_port = htons(PORT);     }          strcpy(buf, "Hello,I'm Client");     if (sendto(myFd, buf, strlen(buf) + 1, 0,                 (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == -1) {         printf("sendto() :%d, %s
", errno, strerror(errno));         exit(errno);     }     printf(" :\"%s\"
", buf);     return 0; }

윈도 다음 UDP 서버 프로그램
#include 
#include 
#define LISTEN_PORT 8888
int main()
{
    SOCKET socket1;
    WSADATA wsaData;
    int iErrorCode;
    if (WSAStartup(MAKEWORD(2,1),&wsaData)) //  Windows Sockets DLL
    {
        printf("Winsock     !
"); WSACleanup(); return 1; } printf(" SOCKET。
"); struct sockaddr_in local; struct sockaddr_in from; int fromlen =sizeof(from); local.sin_family=AF_INET; local.sin_port=htons(LISTEN_PORT); /// local.sin_addr.s_addr=INADDR_ANY; /// socket1=socket(AF_INET,SOCK_DGRAM,0); bind(socket1,(struct sockaddr*)&local,sizeof(local)); while (1) { char buffer[1024]="\0"; printf("waiting for message from others-------------
"); if (recvfrom(socket1,buffer,sizeof(buffer),0,(struct sockaddr*) &from,&fromlen)!=SOCKET_ERROR) { printf("Received datagram from %s--%s
",inet_ntoa(from.sin_addr),buffer); //// cilent sendto(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&from,fromlen); } //Sleep(1000); } closesocket(socket1); return 0; }

통신 방식 을 방송 방식 으로 설정 하지 않 으 면 방송 이 나온다.
[test1@localhost주 립 발] $. / my Client UDP 1 192.168.1.255 sendto () 오류 코드: 13, Permission denied 는 통신 방식 을 방송 방식 으로 설정 하여 테스트 를 진행 합 니 다. 하 나 를 다운로드 할 수 있 습 니 다.  TCP&UDP_SockeTest 디 버 깅 도구 v 2.2, windows 아래 서버 를 열거 나 호스트 windows 아래 에 도 UDP 서버 프로그램 을 작성 합 니 다. 무선 인터넷 을 통 해 호스트 는 가상 컴퓨터 의 방송 메 시 지 를 받 을 수 없습니다. 어떻게 된 일 인지 무선 인터넷 을 통 해 접속 하면 됩 니 다.다음은 테스트 과정, windows 아래 [test1@localhost서버 에 "Hello, I 'm Client" 메 시 지 를 성공 적 으로 보 냈 습 니 다.
[test1@localhost주 립 발] $. / my ServerUDP 1 서버 가 시작 되 었 습 니 다. 연결 을 기다 리 고 있 습 니 다.
호스트 Win 7 테스트 프로그램의 실행 결과:
서버 에서 SOCKET 을 만 들 기 시 작 했 습 니 다.aiting for message from others------------- eceived datagram from 192.168.1.104--Hello,I'm Client
방송 성공!
************************************************************************
     방송의 단점: 호스트 가 방송 메 시 지 를 받 는 프로그램 이 있 든 없 든 방송 메 시 지 는 반드시 네트워크 카드 에 의 해 받 고 운영 체제 에 제출 되 기 때문에 네트워크 의 데이터 가 커지 고 방송 메 시 지 를 받 지 않 는 호스트 에 게 어느 정도 부담 을 줄 수 있다.     방송 처럼 멀티캐스트 메시지 처럼 네트워크 의 모든 호스트 의 네트워크 카드 에 복사 되 지만, 멀티캐스트 그룹 에 가입 하 겠 다 고 발표 한 호스트 의 네트워크 카드 만 이 데 이 터 를 운영 체제 에 제출 하여 처리 할 수 있다.그룹 에 가입 하지 않 으 면 네트워크 카드 는 직접 데 이 터 를 버 립 니 다.
************************************************************************
멀티캐스트 서버 엔 드 프로 그래 밍 절차: 1. socket () 을 호출 하여 소켓 을 만 듭 니 다. 2. 멀티캐스트 IP 주소 와 포트 를 설정 합 니 다. 3. 이 멀티캐스트 주소 에 데 이 터 를 보 냅 니 다. 멀티캐스트 클 라 이언 트 프로 그래 밍 절차: 1. socket () 을 호출 하여 소켓 을 만 듭 니 다.MULTICAST_LOOP. 기본적으로 이 옵션 은 활성 화 됩 니 다.3 、 보 중 3 선택 가능, IP 설정MULTICAST_TTL, 하나의 공유 기 를 지나 갈 때마다 TTl 의 값 은 자동 으로 1 로 줄어든다.이 값 은 기본적으로 1 입 니 다. 다 중 방송 문 이 랜 밖으로 전파 되 는 것 을 방지 하고 설정 할 수 있 습 니 다 (0 ~ 255) 4. 먼저 아래 구조 체 에 struct ip mreq {를 부여 합 니 다.        struct in_addr imr_multiaddr;   /* IP multicast address of group */         struct in_addr imr_interface;   /* local IP address of interface * /}; 그리고 setsockopt 를 호출 하여 이 기 계 를 멀티캐스트 그룹 setsockopt (sockfd, IPPROMO IP, IP ADD MEMBERSHIP, & mreq 에 추가 합 니 다.            sizeof (struct ip mreq) 5, bind () 바 인 딩 로 컬 소켓 6, recvfrom () 7, 방송 그룹 setsockopt (socket, IPPROMO IP, IP DROP MEMBERSHIP, & mreq, sizeof (mreq) 종료
예제 프로그램:
/**********************************************************************
* Compiler: GCC
* Last Update:  Sat 12 Nov 2011 11:33:01 PM CST
* File Name: myServerMulticast2.c
* Description:      
* Usage: myServerMulticast2      [   (   PORT)]
************************************************************************/
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define MAXBUF 1024
#define PORT 60000
 
int main(int argc, char **argv)
{
    int myFd;
    struct sockaddr_in mCastAddr;
    int addrlen = sizeof(mCastAddr);
    char buf[MAXBUF];

    bzero(&mCastAddr, sizeof(mCastAddr));
    bzero(buf, sizeof(buf));
    //     
    if((myFd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        printf("socket()   :%d, %s
", errno, strerror(errno)); exit(errno); } mCastAddr.sin_family = AF_INET; if (argc > 1) { //IP int res; if ((res = inet_pton(AF_INET, argv[1], &mCastAddr.sin_addr)) == -1) { printf("inet_pton() :%d, %s
", errno, strerror(errno)); exit(errno); } else if(res == 0) { printf("IP
"); printf(" :224.0.0.1 ~ 239.255.255.255
"); return 0; } } else { printf("Usage: %s IP
", argv[0]); return 0; } if (argc == 3) { mCastAddr.sin_port = htons(atoi(argv[2])); } else { mCastAddr.sin_port = htons(PORT); } // IP_MULTICAST_TTL 1, .TTL 1 //u_char ttl = 1; //if (setsockopt(myFd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) != 0) { // printf("%s Line number:%d setsockopt() :%d, %s
", \ // __FILE__, __LINE__, errno, strerror(errno)); // exit(errno); //} while (1) { bzero(buf, sizeof(buf)); printf(" :"); if (fgets(buf, sizeof(buf), stdin) == NULL) { exit(0); } if (sendto(myFd, buf, strlen(buf) + 1, 0, (struct sockaddr *)&mCastAddr, sizeof(mCastAddr)) == -1) { printf("sendto() :%d, %s
", errno, strerror(errno)); exit(errno); } printf(" :%s", buf); } return 0; }
/**********************************************************************
* Compiler: GCC
* Last Update:  Sat 12 Nov 2011 11:17:13 PM CST
* File Name: myClientMulticast2.c
* Description: 
************************************************************************/
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define _DEBUG
#define MAXBUF 1024
#define PORT 60000
 
int main(int argc, char **argv)
{
    int myFd, clientFd;
    struct sockaddr_in myAddr, clientAddr;
    struct ip_mreq mreq;
    int addrlen = sizeof(clientAddr);
    char buf[MAXBUF];
    char addrTemp[INET_ADDRSTRLEN];

    bzero(&myAddr, sizeof(myAddr));
    bzero(&clientAddr, sizeof(clientAddr));
    //     ,datagrams
    if((myFd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        printf("%s Line number:%d socket()   :%d, %s
", \ __FILE__, __LINE__, errno, strerror(errno)); exit(errno); } // myAddr.sin_family = AF_INET; myAddr.sin_addr.s_addr = INADDR_ANY; if (argc == 3) { myAddr.sin_port = htons(atoi(argv[2])); } else { myAddr.sin_port = htons(PORT); } // if(bind(myFd, (struct sockaddr *)&myAddr, sizeof(myAddr)) != 0) { printf("%s Line number:%d bind() :%d, %s
", \ __FILE__, __LINE__, errno, strerror(errno)); exit(errno); } // IP_MULTICAST_LOOP u_char loop = 1; if (setsockopt(myFd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) != 0) { printf("%s Line number:%d setsockopt() :%d, %s
", \ __FILE__, __LINE__, errno, strerror(errno)); exit(errno); } // IP_MULTICAST_TTL 1, u_char ttl = 1; if (setsockopt(myFd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) != 0) { printf("%s Line number:%d setsockopt() :%d, %s
", \ __FILE__, __LINE__, errno, strerror(errno)); exit(errno); } // struct ip_mreq if (argc > 1) { // IP int res; if ((res = inet_pton(AF_INET, argv[1], &mreq.imr_multiaddr)) == -1) { printf("%s Line number:%d setsockopt() :%d, %s
", \ __FILE__, __LINE__, errno, strerror(errno)); exit(errno); } else if(res == 0) { printf("IP
"); printf(" :224.0.0.1 ~ 239.255.255.255
"); return 0; } } else { printf("Usage:%s (224.0.0.1 ~ 239.255.255.255)
", argv[0]); return(0); } mreq.imr_interface.s_addr = INADDR_ANY; // if (setsockopt (myFd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) != 0) { printf("%s Line number:%d setsockopt() :%d, %s
", \ __FILE__, __LINE__, errno, strerror(errno)); exit(errno); } printf(" , .....
"); while (1) { bzero(buf, sizeof(buf)); if (recvfrom(myFd, buf, sizeof(buf) - 1, 0, (struct sockaddr *)&clientAddr, &addrlen) == -1) { printf("%s Line number:%d recvfrom() :%d, %s
", \ __FILE__, __LINE__, errno, strerror(errno)); exit(errno); } printf(" %s :%s", inet_ntop(AF_INET, &clientAddr.sin_addr, addrTemp, sizeof(addrTemp)), buf); if (strcmp("exit
", buf) == 0) { break; } } // if (setsockopt (myFd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) != 0) { printf("%s Line number:%d setsockopt() :%d, %s
", \ __FILE__, __LINE__, errno, strerror(errno)); exit(errno); } return 0; }

마찬가지 로 호스트 가 유선 으로 인터넷 에 접속 해 야 호스트 가 가상 컴퓨터 의 다 중 방송 메 시 지 를 받 을 수 있 습 니 다. 호스트 는 무선 인터넷 을 통 해 받 을 수 없습니다. 이 문 제 는 해결 해 야 합 니 다.
실행 결과:
처음에 불법 멀티캐스트 주 소 를 입력 했 는데 오류 가 발생 했 습 니 다. [test1@localhost주 립 발 $. / myClient Multicast 2  244.0.88 setsockopt () 오류 코드: 22, Invalid argument / / 다 중 방송 그룹 에 추가 하려 는 중 오류 가 발생 했 습 니 다. setsockopt (my Fd, IPPROMO IP, IP ADD MEMBERSHIP, & mreq, sizeof (mreq) \ # 224.1.1 과 같은 정확 한 다 중 방송 주 소 를 다시 입력 하 십시오. [test1@localhost주 립 발$. / my Server Multicast 2 224.1.1 보 낼 메 시 지 를 입력 하 십시오: hello 성공 적 으로 상대방 에 게 메 시 지 를 보 냈 습 니 다: hello 보 낼 메 시 지 를 입력 하 십시오: exit 성공 적 으로 상대방 에 게 메 시 지 를 보 냈 습 니 다: exit [test1@localhost주 립 발$. / my Client Multicast 2 224.1.1 클 라 이언 트 가 시작 되 었 습 니 다. 멀티캐스트 메 시 지 를 기다 리 고 있 습 니 다.
@@@@@@
원본:http://book.51cto.com/art/200912/168573.htm

좋은 웹페이지 즐겨찾기