我正在使用 C、Linux 和 GIO GSocket 构建一个小型应用程序,通过 TCP 与数字投影仪进行通信。套接字连接成功,我能够成功向投影仪发送消息。我的问题是,当投影仪收到命令时,我无法接收投影仪返回的自动确认消息。当我发送消息然后使用 g_socket_receive 时,它会阻塞并且似乎永远不会收到响应。
根据过去其他语言中的类似问题,我对这个问题的怀疑是,当我使用 g_socket_send 发送消息时,该消息是在随机可用的本地端口上发送的。然后投影机会自动回复消息源自的端口。不知道它使用什么端口,我无法让我的 GSocket 监听正确的端口。在其他语言中,手动设置本地出站端口很简单,这样我就知道响应将返回到哪里。然而,我根本无法找到任何有关如何使用 GSocket 执行此操作的信息。
任何人都可以对此提供任何帮助,或者对我可能缺少的其他问题有任何想法吗?
谢谢!
最佳答案
您的读取/接收调用很可能会阻塞,因为您命令读取/接收的字节数比发送的答案长。
出于测试目的,请执行以下操作:
int fd = -1;
/* setup fd */
char buffer[1024] = {0};
ssize_t size_buffer = sizeof(buffer) - 1;
size_t size_read_total = 0;
ssize_t size_read = 0;
while (size_buffer > size_read_total)
{
size_read = read(fd, buffer + size_read_total, 1); /* Wait until exactly one byte had been read. */
if (-1 = size_read)
{
if (EINTR == errno)
{
continue;
}
if ((EAGAIN == errno) || (EWOULDBLOCK == errno))
{
continue;
}
break; /* Fatal error */
}
else (0 == size_read)
{
break; /* Connection closed by sending side. */
}
size_read_total += size_read;
}
if (-1 == size_read)
{
perror("read() failed");
}
else
{
printf("Received %zd bytes as: '%s'\n", size_read_total, buffer);
}
关于c - 当使用 GSocket 通过 TCP 连接发送消息时,如何控制出站端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18961261/