2013-03-11 5 views
1

나는 클라이언트 서버 UDP 응용 프로그램을 개발했습니다. Server UDP 소켓은 BROADCAST UDP 소켓으로 설정됩니다. 양측 코드가 오류를 생성하지는 않지만 BROADCAST UDP SERVER Side에서 보낸 메시지는 클라이언트 측에서 수신되지 않습니다. 친절하게도 내 코드를보고, 알아낼 수없는 실수가 있음을 알고 있습니다.클라이언트가 BROADCAST UDP 서버에서 메시지를 수신 할 수 없습니다. (Winsock)

서버 :

#define PORT 8888 //The port on which to listen for incoming data 

int main() 
{ 

SOCKET s; 
struct sockaddr_in serverSocket, clientSocket; 

char receiveBuffer[1000]; 
//int receiveBufferLength=1000; 
int clientSocketLength; 
int recv_len; 

clientSocketLength = sizeof(clientSocket) ; 

WSADATA wsa; 
//Initialise winsock 
printf("\nInitialising Winsock..."); 
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0) 
{ 
    printf("Failed. Error Code : %d",WSAGetLastError()); 
    exit(EXIT_FAILURE); 
} 
printf("Socket Initialised.\n"); 

//Create a socket 
if((s = socket(AF_INET , SOCK_DGRAM , 0)) == INVALID_SOCKET) 
{ 
    printf("Could not create socket : %d" , WSAGetLastError()); 
} 
printf("Socket created.\n"); 

//Prepare the sockaddr_in structure 
serverSocket.sin_family = AF_INET; 
serverSocket.sin_addr.s_addr = INADDR_ANY; 
serverSocket.sin_port = htons(PORT); 

int broadcast =1; 


if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*) &broadcast, sizeof(broadcast)) < 0) { 
    //close(sock); 
    printf("Error in setting broadcast option"); 
} 
//Bind 
if(bind(s ,(struct sockaddr *)&serverSocket , sizeof(serverSocket)) == SOCKET_ERROR) 
{ 
    printf("\nBind failed with error code : %d" , WSAGetLastError()); 
    exit(EXIT_FAILURE); 
} 
printf("Bind done\n\n"); 

//keep listening for data 


    printf("\n\t\t\tWaiting for data...\n"); 
    fflush(stdout); 
    //receiveBuffer[2000]=NULL; 

    if((recv_len = recvfrom(s, receiveBuffer, 1000, 0, (struct sockaddr *) &clientSocket, &clientSocketLength)) == SOCKET_ERROR) 
    { 
     printf("\n\nrecvfrom() failed with error code : %d" , WSAGetLastError()); 
     //exit(EXIT_FAILURE); 
     while(1); 
    } 

    //print details of the client/peer and the data received 
    printf("\n\nReceived packet from %s:%d\n", inet_ntoa(clientSocket.sin_addr), ntohs(clientSocket.sin_port)); 
    printf("\nClient Says: "); 
     printf(receiveBuffer,recv_len); 

    serverSocket.sin_addr.s_addr = INADDR_BROADCAST; 
    //now reply the client with the same data 
    if (sendto(s, receiveBuffer, recv_len, 0, (struct sockaddr*) &serverSocket, sizeof(serverSocket)) == SOCKET_ERROR) 
    { 
     printf("\nsendto() failed with error code : %d" , WSAGetLastError()); 
     // exit(EXIT_FAILURE); 
     while(1); 
    } 
    else 
     printf("\nMessage Sent Back to Client"); 
    while(1); 



closesocket(s); 
WSACleanup(); 
return 0; 

} 

CLIENT :

#define PORT 8888 //The port on which to listen for incoming data 
#define SERVER "127.0.0.1" //ip address of udp server 
//#define PORT 8888 //The port on which to listen for incoming data 

int main(void) 
{ 
struct sockaddr_in connectedSocket; 

int s; 
int length=sizeof(connectedSocket); 

char receiveBuffer[1000]; 
char message[1000]; 

//clear the buffer by filling null, it might have previously received data 
memset(receiveBuffer,'\0', 1000); 

WSADATA wsa; 
//Initialise winsock 
printf("\nInitialising Winsock...\n"); 
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0) 
{ 
    printf("\nFailed. Error Code : %d",WSAGetLastError()); 
    exit(EXIT_FAILURE); 
} 
printf("\n.........Initialised.\n"); 


//create socket 
if ((s=socket(AF_INET, SOCK_DGRAM, 0)) == SOCKET_ERROR) 
{ 
    printf("\n\nsocket() failed with error code : %d" , WSAGetLastError()); 
    exit(EXIT_FAILURE); 
} 


//setup address structure 
memset((char *) &connectedSocket, 0, sizeof(connectedSocket)); 
connectedSocket.sin_family = AF_INET; 
connectedSocket.sin_port = htons(PORT); 
//connectedSocket.sin_port = INADDR_BROADCAST; 
connectedSocket.sin_addr.S_un.S_addr = inet_addr(SERVER); 

printf("\n\n\nEnter message : "); 
    gets(message); 

    //send the message 
    if (sendto(s, message,sizeof(message) , 0 , (struct sockaddr *) &connectedSocket, sizeof(connectedSocket)) == SOCKET_ERROR) 
    { 
     printf("\nsendto() failed with error code : %d" , WSAGetLastError()); 
     exit(EXIT_FAILURE); 
    } 

     printf("\nMessage Successfully sent to Server"); 
     // fflush(stdout); 

    if (recvfrom(s, receiveBuffer, 1000, 0, (struct sockaddr *) &connectedSocket,&length) == SOCKET_ERROR) 
    { 
     printf("\nrecvfrom() failed with error code : %d" , WSAGetLastError()); 
     exit(EXIT_FAILURE); 
     while(1); 
    } 

    printf("\nServer Says : "); 
    printf(receiveBuffer,sizeof(receiveBuffer)); 

    while(1); 

closesocket(s); 
WSACleanup(); 

return 0; 

}

답변

2

당신은 serverSocket에 다시 클라이언트로 응답을 보내는 정말 도움이 필요합니다. 메시지를 수신 한 clientsocket이 이미 있습니다.이 메시지를 사용하여 서버에서 클라이언트로 메시지를 다시 보냅니다.

제거 ...

serverSocket.sin_addr.s_addr = INADDR_BROADCAST; 

변경 ...

if (sendto(s, receiveBuffer, recv_len, 0, (struct sockaddr*) &serverSocket, sizeof(serverSocket)) == SOCKET_ERROR) 

if (sendto(s, receiveBuffer, recv_len, 0, (struct sockaddr*) &clientSocket, sizeof(clientSocket)) == SOCKET_ERROR) 

에 이제 작동합니다.

+0

예, 성공했습니다. 하지만 특정 클라이언트가 아닌 모든 클라이언트에게 메시지를 브로드 캐스팅하려고합니다. ( 또한 말해 클라이언트 측의 서버에서 브로드 캐스팅 한 메시지를 수신 할 수 있습니까? – Ayse

+0

여기에 약간 혼란 스럽습니다. 메시지를 받고 서버가 가져 오면 서버에서 동일한 메시지를 다시 브로드 캐스트하려고합니다. –

+0

아니요, 서버에서만 메시지를 브로드 캐스트하고 내 클라이언트가 브로드 캐스트 메시지를 받길 원합니다. ( – Ayse

관련 문제