브로드 캐스트
ip는 udp에서만 사용가능.
브로드캐스트 send부분
#include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <stdlib.h> #include <string.h> #include <unistd.h>
void DieWithError(char * errorMessage);
int main(int argc, char *argv[]) { int sock; struct sockaddr_in broadcastAddr; char * broadcastIP; unsigned short broadcastPort; char * sendString; int broadcastPermission; unsigned int sendStringLen; if(argc <4)//main인자가 4보다 작을 경우 에러처리, 즉 실행시 ip주소를 같이 쳐야 하므로 에러처리를 4보다 작으면 { //으로 지정 fprintf(stderr, "Usage: %s <IP Address><Port><Send Sting>\n", argv[0]); return 1; } broadcastIP= argv[1]; //IP는 "192.xxx.....문자열이므로 그냥 넣어도 된다. 실행이름을 적을시 2번째로 ip를 적는다. broadcastPort= atoi(argv[2]);//포트는 번호이기 때문에 아스키문자를 정수형으로 변환한다. sendString=argv[3]; //직접 브로드캐스트 Recv로 보내는 데이터.
sock=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); //IP에서 udp만 브로드캐스트 할 수 있다. setsockopt(sock, SOL_SOCKET, SO_BROADCAST,(void *)&broadcastPermission ,sizeof(broadcastPermission)); //이 함수에서
memset(&broadcastAddr, 0, sizeof(broadcastAddr)); broadcastAddr.sin_family= AF_INET; broadcastAddr.sin_addr.s_addr = inet_addr(broadcastIP); broadcastAddr.sin_port = htons(broadcastPort); //여기까지는 구조체 설정부분. 알고 있으므로 생략
sendStringLen= strlen(sendString);//변수에 전송 데이터 문자열 크기만큼 대입. , 즉 전송하는 데이터 크기.
for(;;) { sendto(sock, sendString, sendStringLen, 0, (struct sockaddr *)&broadcastAddr,sizeof(broadcastAddr));//소켓에 데이터를 넣는 부분. 브로드캐스트 주소에 그 크기만큼의 주소를 //전송할 문자열 데이터를 소켓에 집어넣어 보내는 함수이다. sleep(3);//문자를 전송할 때 까지 대기하다가 보내지면, 자동 종료. } }
브로드캐스트 recv부분. |
#include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define MAXRECVSTRING 255
void DieWtihError(char * errorMessage); int main(int argc, char *argv[]) { int sock; struct sockaddr_in broadcastAddr; unsigned int broadcastPort; char recvString[MAXRECVSTRING+1]; int recvStringLen; if(argc != 2)// 실행시 ./파일명 포트번호 이런형식으로 출력하지 않는 경우 다음과 같은 메시지 출력. { fprintf(stderr, "Usage: %s <Broadcast Port>\n", argv[0]); return 1; } broadcastPort = atoi(argv[1]);// ip번호 sock= socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); memset(&broadcastAddr, 0, sizeof(broadcastAddr)); broadcastAddr.sin_family = AF_INET; broadcastAddr.sin_addr.s_addr=htonl(INADDR_ANY); broadcastAddr.sin_port=htons(broadcastPort);
bind(sock, (struct sockaddr *) &broadcastAddr, sizeof(broadcastAddr)); //broadcastAddr 주소에 크기만큼 소켓에 넣는다.
recvStringLen = recvfrom(sock, recvString ,MAXRECVSTRING, 0, NULL, 0); //소켓에서 메시지를 받느다. 소켓에 데이터를 받는 함수 recvfrom(), 메시지의 길이를 반환하므로 //변수 int형 recvStringLen에 값을 넣는다.
recvString[recvStringLen] = '\0';// 끝에 문자열 널을 넣기 위한 부분. //넣지 안으면 끝에 이상한 문자가 찍힌다. 왜냐하면 '널'이 있어야 문자열로 인식한다. printf("Received: %s\n", recvString);//출력 close(sock); return 0; }
|
실행 결과