当前位置: 首页 > 知识库问答 >
问题:

客户端无法从广播UDP服务器接收消息。(温索克)

张敏达
2023-03-14

我开发了一个客户端-服务器UDP应用程序。服务器UDP套接字设置为广播UDP套接字。双方的代码不会产生任何错误,但客户端未接收到从广播UDP服务器端发送的消息。请看一下我的代码,我知道有一些错误我想不通。我真的需要帮助:

服务器:

#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;

}

客户:

#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;

}

共有1个答案

蒙化
2023-03-14

您正在将回复发送回< code>serverSocket上的客户端。您已经有一个接收消息的< code>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)

现在应该可以了。

 类似资料:
  • 我是一个使用python进行套接字编程的初学者。我正在做我的课程项目。我的项目的一部分需要用不同的端口发送和接收UDP消息。提供了名为robot的服务器程序,我需要编写名为student的客户端程序,它可以与机器人进行交互。因此,我不能显示服务器程序中的所有源代码。 这是服务器程序中与UDP套接字相关的部分 这是我的客户端程序。s3 是 UDP 套接字。我可以成功地向服务器程序发送消息,但无法从中

  • 问题内容: 我正在尝试用两个客户端实现一个系统,其中一个客户端发送一条消息,而另一个客户端将接收该消息。下图将以更直观的方式对其进行解释: 因此,客户端1将消息发送到服务器(此工作正常),服务器接收到“推送”消息并发出应由客户端2接收的“弹出”消息。这里的问题是客户端2从未收到“流行”消息。:( 这是所有代码。 SERVER.JS 客户1(aka mobile.html) 客户2(aka web.

  • 问题内容: 我要进行最简单的解释。我的Java TCP项目有一个服务器和三个客户端。 服务器具有一个ClientThread。每个客户端都有一个ServerThread和一个UserThread。 工作流程为: 1.客户端(例如,client_0)的UserThread获取用户输入,然后将消息发送到服务器。 2.服务器的ClientThread捕获来自client_0的消息,并将另一条消息发送到另

  • 问题内容: 我要进行最简单的解释。我的Java TCP项目有一个服务器和三个客户端。 服务器具有一个ClientThread。每个客户端都有一个ServerThread和一个UserThread。 工作流程为: 1.客户端(例如,client_0)的UserThread获取用户输入,然后将消息发送到服务器。 2.服务器的ClientThread捕获来自client_0的消息,并将另一条消息发送到另

  • 我正在尝试使用UDP在服务器(在公共IP上)和客户端(通过NAT)之间进行双向通信。我的逻辑是,如果服务器向IP和它接收数据包的端口发送一些数据,客户端仍然应该得到它,因为NAT最终会有将数据包发送到客户端的映射。 客户端有 2 个进程,一个用于发送数据包,另一个进程用于接收数据。服务器继续等待数据,如果它获得数据,它会将数据发送回从接收数据的端口和 IP。 客户代码如下: client_recv

  • 我刚刚开始学习Java。我修改了服务器/客户端通信程序的客户端代码,为客户端创建了两个线程,一个是用于接收用户输入的主线程,另一个是用于接收服务器响应的inputThread。我确信服务器已经向客户机发送了响应,但是,在客户机上没有获得响应消息。 这是我的代码。有谁能帮我弄明白吗?谢谢