我正在编写一个简单的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服务器以获取弹出消息并手动发送消息可以正常工作 .
调试几个小时后,我找不到任何导致此问题的原因 . 我会非常感谢任何建议,
先感谢您,
1 回答
插入Wireshark以监控TCP / IP后,问题出在LF终止字符上,但未正确发送 . 解决此问题客户端已正常工作 .