네트워크/vmware 실습

7월 11일 브로드캐스트 (정리 중)

송시혁 2013. 7. 11. 16:14

브로드 캐스트 

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, 0sizeof(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, 0sizeof(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;
}     


실행 결과