You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言主从Socket间时间戳通信故障排查求助

问题定位与修复

错误码10014对应Windows Socket的WSAEFAULT错误,核心问题出在recvfrom的参数传递上:

  • recvfrom的第6个参数(地址长度)要求传入指针,因为函数会在调用后更新这个值为实际接收到的地址长度。你直接传了server_address_size(一个int值),这会导致系统尝试向无效内存地址写入数据,触发错误。

另外你的sendto也存在不合理之处:用sizeof(buffer)作为发送长度会把整个1024字节的缓冲区都发出去,包括字符串后面的垃圾数据,正确做法应该发送实际的字符串长度(strlen(buffer)+1,+1是为了带上字符串终止符)。

修正后的代码

发送函数修正

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

    // 发送实际字符串长度,而非整个缓冲区大小
    int sendLen = strlen(buffer) + 1;
    sendto(clientSocket, buffer, sendLen, 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);
     }    
}

额外注意事项

  • 确保接收端的socket已经正确绑定到127.0.0.1:4455,并且处于可用状态
  • 发送端的目标地址(client_address)要正确设置:sin_family设为AF_INET,sin_addr设为inet_addr("127.0.0.1"),sin_port用htons(4455)转换为网络字节序
  • 建议检查sendto的返回值,确认数据是否发送成功

内容的提问来源于stack exchange,提问作者Varun Bhat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:07:35