2013-03-11 123 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

相关问题