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
相关产品推荐
相关产品推荐

