UDP 점대 점 통신, 방송 통신, 멀티캐스트 통신
16749 단어 Linux 네트워크 프로 그래 밍
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