0

我正在使用 C、Linux 和 GIO GSocket 构建一个小型应用程序,以通过 TCP 与数字投影仪进行通信。套接字连接成功,我能够成功地向投影仪发送消息。我的问题是我无法收到投影仪在收到命令时返回的自动确认消息。当我发送一条消息然后使用 g_socket_receive 时,它​​会阻塞并且似乎永远不会收到响应。

基于过去在其他语言中的类似问题,我对这个问题的怀疑是,当我使用 g_socket_send 发送消息时,消息是在随机可用的本地端口上发送的。然后投影机自动回复消息来源的端口。不知道它使用了什么端口,我无法让我的 GSocket 监听正确的端口。在其他语言中,手动设置本地出站​​端口是一件简单的事情,这样我就知道响应会返回到哪里。但是,我根本找不到任何有关如何使用 GSocket 进行操作的信息。

任何人都可以为此提供任何帮助,或者对我缺少的其他问题有什么想法吗?

谢谢!

4

2 回答 2

0

您可以GSocket使用该函数将出站绑定到本地地址(IP 和端口)g_socket_bind,就像监听套接字一样。

这样做不太可能解决您的问题。投影机应将回复数据包发送到发送请求的端口;很少需要将客户端套接字绑定到特定端口。wireshark验证使用或发送和接收的内容tcpdump

于 2013-09-23T14:23:36.640 回答
0

您的 read/receive 调用很可能会阻塞,因为您命令读取/接收的字节数比发送的答案长。

出于测试目的,请执行以下操作:

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);
}
于 2013-09-23T14:41:45.607 回答