通过与GSocket的TCP连接发送消息时,如何控制出站端口?

通过与GSocket的TCP连接发送消息时,如何控制出站端口?,c,linux,glib,gio,C,Linux,Glib,Gio,我正在使用C、Linux和GIO GSocket构建一个小应用程序,通过TCP与数字投影仪通信。插座连接成功,我能够成功向投影仪发送消息。我的问题是,当投影仪接收到命令时,我无法接收投影仪返回的自动确认消息。当我发送一条消息,然后使用g_socket_receive时,它会阻塞,而且似乎从未收到响应 基于其他语言中过去的类似问题,我对这个问题的怀疑是,当我使用g_socket_send发送消息时,消息是在随机可用的本地端口上发送的。然后,投影仪会自动回复消息来源的端口。由于不知道它使用了什么端口

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

基于其他语言中过去的类似问题,我对这个问题的怀疑是,当我使用g_socket_send发送消息时,消息是在随机可用的本地端口上发送的。然后,投影仪会自动回复消息来源的端口。由于不知道它使用了什么端口,我无法让我的GSocket在正确的端口上侦听。在其他语言中,只需手动设置本地出站端口,就可以知道响应将返回到哪里。但是,我还没有找到任何关于如何使用GSocket实现这一点的信息

有没有人能在这方面提供任何帮助,或者对我遗漏的其他问题有什么想法


谢谢

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


但这样做不太可能解决你的问题。投影仪应将应答包发送至发送请求的端口;很少需要将客户机套接字绑定到特定端口。验证使用
wireshark
tcpdump
发送和接收的内容,您的读取/接收呼叫很可能会被阻塞,因为您要读取/接收的字节比发送的应答长

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

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);
}

如果您启动与服务器(投影仪)的TCP连接,TCP/IP堆栈将管理本地端口(您只需要知道服务器的IP:端口对),因此您无需
侦听任何内容;listen用于自己创建服务器。我猜你的问题出在其他地方……因此,如果我没有将套接字绑定到特定的本地端口,当我使用刚才调用g_socket_send()的同一套接字调用g_socket_receive()时,它应该会自动检查发送消息的同一端口号上的传入数据?如果是这样的话,那么我的问题一定在别处。我将尝试wireshark,看看我能看到什么。在g_socket_read调用中,我将在哪里插入这个?在阻塞超时后运行?