我正在使用C,Linux和GIO GSocket构建一个小型应用程序,通过TCP与数字投影仪进行通信。套接字连接成功,我可以成功地向投影机发送消息。我的问题是,当收到命令时,我无法收到投影机返回的自动确认消息。当我发送消息然后使用g_socket_receive时,它会阻塞并且似乎永远不会收到响应。
基于过去在其他语言中的类似问题,我怀疑这个问题是当我使用g_socket_send发送消息时,消息是在随机可用的本地端口上发送的。然后,投影机自动回复消息来自的端口。不知道它使用了什么端口,我无法让我的GSocket监听正确的端口。在其他语言中,手动设置我的本地出站端口是一件简单的事情,这样我就知道响应会回到哪里。但是,我还没有找到任何关于如何使用GSocket的信息。
任何人都可以提供此方面的任何帮助,或者对我错过的其他问题的任何想法?
谢谢!
答案 0 :(得分:0)
您可以使用g_socket_bind
函数将出站GSocket
绑定到本地地址(IP和端口),就像您收听侦听套接字一样。
这样做不太可能解决您的问题。投影机应将回复数据包发送到发送请求的端口;您很少需要将客户端套接字绑定到特定端口。使用wireshark
或tcpdump
验证发送和接收的内容。
答案 1 :(得分:0)
您的读取/接收呼叫很可能是阻止因为您命令读取/接收的字节多于发送的答案很长。
出于测试目的,请执行以下操作:
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);
}