2013-03-11 125 views
1

我開發了一個客戶端服務器UDP應用程序。 Server UDP套接字被設置爲BROADCAST UDP套接字。雙方的代碼不會產生任何錯誤,但從廣播UDP服務器端發送的消息不在客戶端收到。請看看我的代碼,我知道有一些我不明白的錯誤。我真的需要幫助:客戶端無法接收來自BROADCAST UDP Server的消息。 (Winsock)

SERVER:

#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 2013-03-11 10:55:47

+0

我在這裏有點困惑,你希望客戶端廣播一條消息,你的服務器得到它,然後你想服務器重新播放相同的消息? – 2013-03-11 11:03:44

+0

不,我只想要服務器廣播消息,然後我希望我的客戶端接收廣播消息:( – Ayse 2013-03-11 11:10:47

相關問題