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

sqyvllje  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(104)

我在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);
     }    
}

字符串

qc6wkl3g

qc6wkl3g1#

在你的recvfrom调用中,你传递了server_address_size,但是recvfrom函数需要一个 pointer 作为参数。你应该传递&server_address_size以避免无效指针错误(代码10014)。
另外,您似乎正在使用UDP,因此我在此部分中基于这样的假设:server 组件通常使用IP和已知端口号 clients 将使用IP和端口0 -允许系统分配一个随机的、未使用的端口号,该端口号不会与现有的套接字冲突。然后服务器将响应IP:当接收到来自客户端的请求时,它在recvfrom()调用中获取的端口。
OTOH,如果您的 * 服务器 * 只是在网络范围内广播时间同步,到一个已知端口,那么您的 * 服务器 * 应该使用端口0,您的客户端(每个在不同的IP上)将使用服务器发送 * 到 * 的相同已知端口。

相关问题