繁体   English   中英

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

[英]How do I control the outbound port when sending a message via a TCP connection with a GSocket?

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

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

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

谢谢!

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

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

您的读取/接收呼叫很可能会阻塞,因为您订购的读取/接收字节数超过了发送的应答时间。

为了进行测试,请执行以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM