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