[소켓] 서버 / 클라이언트의 브로드캐스트와 송수신 병행할때
글쓴이: kakalot81 / 작성시간: 수, 2008/09/24 - 9:29오후
소켓으로 브로드캐스팅과 개별송수신을 한 코드안에 집어 넣으려 하니 잘 안되는군요. 소켓 초보임에도 불구하고, 책을 정독하지 않아 그런지 엄청 헤메고 있습니다.ㅜㅜ
서버에서 2개의 클라이언트로 브로드캐스팅은 되는데, 브로드캐스팅을 받은 후 각 클라이언트에서 서버로 확인 메세지를 보내려고 할 때 "Recv : Bad Adress Error"가 발생합니다. 소켓주소 구조체 문제일 것 같아 주소값을 하나씩 매치시켜 줘도 잘 안되는 군요.
코드 올려 보겠습니다.
Server.c
/*...소켓(Dgram)생성...*/ /*브로드캐스트 관련 구조체 선언*/ memset(&broad_addr,0,sizeof(broad_addr)); broad_addr.sin_family = AF_INET; broad_addr.sin_port = htons(MYPORT); broad_addr.sin_addr.s_addr = inet_addr(argv[1]); /*송수신 관련 구조체 선언*/ memset(&master_addr,0,sizeof(master_addr)); master_addr.sin_family = AF_INET; master_addr.sin_port = htons(MYPORT); master_addr.sin_addr.s_addr = htons(INADDR_ANY); // 요걸 서버(master) ip로 바꾸어도 잘 안되서 임의로 놓았습니다. /*브로드캐스트 옵션 설정*/ if(setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &so_broadcast, sizeof(so_broadcast )) == -1) { perror("setsocketopt(SO_BROADCAST)"); exit(1); } /*송수신을 위한 소켓바인드*/ if(bind(sockfd, (struct sockaddr *)&master_addr, sizeof(struct sockaddr)) == -1) { perror("bind"); exit(1); } while(1) { /*브로드캐스트 to 192.168.0.255 */ if(sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&broad_addr, sizeof(broad_addr)) == -1) { perror("broadcast"); exit(1); } ----------------------------------------- <span>/* 이 코드까지는 성공적으로 실행이 됩니다.*/</span> /*2개의 클라이언트로부터 각각 패킷을 받음*/ <span><span> /*"Recv : Bad Adress Error"가 발생*/</span></span> if((numbytes1 = recvfrom(sockfd, recvbuf1, BUFSIZE, 0, (struct sockaddr *)&slave1_addr, sizeof(struct sockaddr_in))) == -1) { perror("recv"); exit(1); } if((numbytes2 = recvfrom(sockfd, recvbuf2, BUFSIZE, 0, (struct sockaddr *)&slave2_addr, sizeof(struct sockaddr_in))) == -1) { perror("recv"); exit(1); } } // while문 종료 /*소켓 닫음*/
client.c
/*...소켓생성...*/ /*브로드캐스트를 받기 위한 구조체 선언*/ addr.sin_family=AF_INET; addr.sin_addr.s_addr=inet_addr("192.168.0.255"); addr.sin_port=htons(MYPORT); bzero(&(addr.sin_zero), 8); /*송수신 위한 구조체 선언*/ master_addr.sin_family=AF_INET; master_addr.sin_addr.s_addr= htons(INADDR_ANY); // 마찬가지로 주소를 master ip로 지정해 보아도 같은 error master_addr.sin_port=htons(MYPORT); bzero(&(master_addr.sin_zero), 8); /*브로드캐스트 대기를 위한 소켓 바인드*/ if(bind(sockfdc, (struct sockaddr *)&addr, sizeof(struct sockaddr)) == -1) { perror("bind"); exit(1); } while(1) { /*서버로부터의 브로드캐스트 패킷 송신(성공)*/ if((numbytes = recvfrom(sockfdc, buf, BUFSIZE-1, 0, NULL, 0)) == -1) { perror("recv"); exit(1); } /*브로드 캐스트 완료 패킷을 서버로 보냄(error는 나지 않으나 패킷을 제대로 날렸는지 확인불가)*/ if(sendto(sockfdc, "Rendering done\n", BUFSIZE, 0, (struct sockaddr *)&mas ter_addr, sizeof(struct sockaddr)) == -1) { perror("send"); exit(1); } /*소켓 닫기*/ }
요약
1. 브로드캐스트 종착점과, 송수신 할때의 주소가 서로 다른 관계로 구조체를 여러개로 나누어 정의했는데 옳은 결정인지요?
2. 파일기술자 sockfd를 저처럼 여러번 송수신에 활용할 수 있나요?
3. Recieve error가 발생하는 이유와 해결책에는 어떤 방법이 있을까요?
4. 그리고, select()함수 만으로 각 패킷을 동기화가 가능한지 코멘트좀 부탁드립니다.
각 코드에 제가 의도한 것들을 주석으로 달아보았습니다. 길어서 제대로 읽어질지 잘 모르겠지만, 자비로우신 분의 조언 부탁드립니다.~
Forums:
급한 마음에 한번 더
급한 마음에 한번 더 Top으로 올려봅니다. 질문 올린 이후에도 여러 방법을 써봤지만, 잘 안되네요. 도움 부탁드려요.ㅜㅜ
댓글 달기