我正在编写一个简单的TCP客户端,以便我可以连接到UR(通用机器人)机器人,并将消息(弹出XXXX)发送到端口号29999,以在UR屏幕中生成弹出消息。 UR服务器在连接时没有正确响应gethostbyaddr gethostbyname函数,因此,为了测试,我直接连接到IP和端口。简单TCP客户端的代码如下:
int initTCPSocket(void)
{
struct in_addr ip;
struct hostent *server;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
printf("ERROR opening socket");
return -1;
}
portno = atoi(serverPort.c_str());
if (!inet_aton(serverIP.c_str(), &ip))
printf(" ERROR: error parsing IP address %s", serverIP.c_str());
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htons(ip.s_addr);
serv_addr.sin_port = htons(portno);
if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
{
printf("ERROR connecting to server");
return -3;
}
else
printf("Connected to server");
}
实际发送数据的代码是:
bool SendDataTCP (tekniker_tcp_comms::SendDataTCP::Request &req, tekniker_tcp_comms::SendDataTCP::Response &res)
{
if (sockfd < 0)
{
ROS_INFO("ERROR in connection");
res.dataSent=false;
return true;
}
size_t msgLength = req.msg.data.length();
//write to connected server.
int n = write(sockfd, req.msg.data.c_str(),(int)msgLength);
if (n < 0)
{
ROS_INFO("ERROR writing to socket");
res.dataSent=false;
}
else
{
ROS_INFO("write %d bytes. Message %s",n, req.msg.data.c_str());
res.dataSent=true;
}
return true;
}
我获得了正确连接的消息,我可以调用服务,并且写入功能正常,但是,UR中没有弹出窗口。看来UR没有正确收到消息。 使用ncat(ncat 172.16.205.2 29999)连接到UR服务器以获取弹出消息,并手动发送消息。
调试几个小时后,我找不到任何导致此问题的原因。我会非常感谢任何建议,
提前谢谢你,
答案 0 :(得分:0)
插入Wireshark以监控TCP / IP后,问题出在LF终止字符上,但未正确发送。 解决这个问题,客户端已正常工作。