我在 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);
}
}
在您的
recvfrom
调用中,您正在传递 server_address_size
,但 recvfrom
函数需要该参数的 pointer。您应该传递 &server_address_size
以避免无效指针错误(代码 10014)。
此外,您似乎正在使用 UDP,因此我将这部分基于该假设:server 组件通常会使用 IP 和已知端口号(以便客户端可以找到它)。 clients 将使用 IP 和端口 0——允许系统分配一个随机的、未使用的端口号,该端口号不会与现有套接字冲突。然后服务器收到客户端请求时会响应在recvfrom()调用中获取的IP:Port。
OTOH,如果您的服务器只是在网络范围内向已知端口广播时间同步,那么您的服务器应该使用端口0,并且您的客户端(每个都位于不同的IP上)将使用与服务器相同的已知端口正在发送至。
我希望这是有道理的并且有帮助。