C 中主从套接字之间的时间戳通信出现问题

问题描述 投票:0回答:1

我在 C 中有两个函数涉及主套接字和从套接字之间的通信。主设备使用 sendSyncMessage 函数向从设备发送时间戳,而从设备则使用 receiveSyncMessage 接收时间戳。主站产生正确的输出(例如“2023-12-07 11:07:03”),但从站返回错误代码 10014。

主机和从机的IP地址都是127.0.0.1,端口都是4455。

主机产生正确的输出,但从机返回错误代码10014。我怀疑

recvfrom
的使用方式存在问题。有人可以帮助我识别并解决问题吗?

void sendSyncMessage(SOCKET clientSocket, struct sockaddr_in client_address)
{
    SYSTEMTIME systemTime;
    char buffer[1024];

    GetLocalTime(&systemTime);

    sprintf(buffer, "SYNC:%04d-%02d-%02d %02d:%02d:%02d",  systemTime.wYear, systemTime.wMonth, systemTime.wDay,
        systemTime.wHour, systemTime.wMinute, systemTime.wSecond);

    printf("The current timestamp : %s\n", buffer);

    sendto(clientSocket, buffer, sizeof(buffer), 0, (struct sockaddr*)&client_address, sizeof(client_address));
}

void receiveSyncMessage(SOCKET server_socket)
{
    struct sockaddr_in server_address;
    int server_address_size = sizeof(server_address);
    char buffer[1024];

    int bytesReceived = recvfrom(server_socket, buffer, sizeof(buffer), 0, (struct sockaddr*)&server_address, server_address_size);
    if (bytesReceived == SOCKET_ERROR) {
    fprintf(stderr, "Receive failed: %ld\n", WSAGetLastError());
    }
    else{
        buffer[bytesReceived] = '\0';
        printf("Received Sync timestamp: %s\n", buffer);
        printf("Bytes received: %d\n", bytesReceived);
     }    
}
c windows sockets winsock
1个回答
0
投票

在您的

recvfrom
调用中,您正在传递
server_address_size
,但
recvfrom
函数需要该参数的 pointer。您应该传递
&server_address_size
以避免无效指针错误(代码 10014)。

此外,您似乎正在使用 UDP,因此我将这部分基于该假设:server 组件通常会使用 IP 和已知端口号(以便客户端可以找到它)。 clients 将使用 IP 和端口 0——允许系统分配一个随机的、未使用的端口号,该端口号不会与现有套接字冲突。然后服务器收到客户端请求时会响应在recvfrom()调用中获取的IP:Port。

OTOH,如果您的服务器只是在网络范围内向已知端口广播时间同步,那么您的服务器应该使用端口0,并且您的客户端(每个都位于不同的IP上)将使用与服务器相同的已知端口正在发送

我希望这是有道理的并且有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.