测试修改代码 需要修改代码tcp 通信不友好
bool TcpReporting::configureHook(){
port=port_prop.value();
log(Error) << "is TcpReporting ..............";
return true;
}
bool TcpReporting::startHook()
{
this->configureHook();
RTT::Logger::In in("TcpReporting::startup");
fbody = new RTT::SocketMarshaller(this);
this->addMarshaller( 0, fbody );
ListenThread::createInstance( fbody, port );
return ReportingComponent::startHook();
}
数据处理端 就是一个while 循环 需改改的地方
void Datasender::loop()
{
*os << "100 Orocos 1.0 TcpReporting Server 1.0" << std::endl;
while( os->isValid() )
{
interpreter->process();
}
Logger::log() << Logger::Info << "Connection closed!" << Logger::endl;
}
测试端代码
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#define SERVER_PORT_NUM 3142
#define SERVER_IP_ADDR "127.0.0.1"
#define ERROR -1
#define OK 0
int tcpOpen(char * serverName /* name or IP address of server */,
int serverPort /* port */);
void tcpClose(int fd);
void tcpWrite(int fd, const char* cmd);
char* tcpRead(int fd);
int main()
{
char *str;
int sockFd = tcpOpen(SERVER_IP_ADDR, SERVER_PORT_NUM);
//tcpClose(sockFd);
//tcpWrite(sockFd, "This is a test");
while(1){
tcpWrite(sockFd, "This is a test");
str = tcpRead(sockFd);
printf("==%s\n",str);
free(str);
sleep(1);
}
return 0;
}
int tcpOpen(char * serverName /* name or IP address of server */,
int serverPort)
{
struct sockaddr_in serverAddr; /* server's socket address */
int sockAddrSize; /* size of socket address structure */
int sFd; /* socket file descriptor */
int n;
int addr1, addr2, addr3, addr4;
unsigned int ipaddr;
sscanf(serverName, "%d.%d.%d.%d", &addr1, &addr2, &addr3, &addr4);
ipaddr = ((addr1<<24) & 0xFF000000) |
((addr2<<16) & 0x00FF0000) |
((addr3<<8) & 0x0000FF00) |
(addr4 & 0x000000FF);
printf("Server: ipaddr[0x%08x], port:[%d]\n", ipaddr, SERVER_PORT_NUM);
/* create client's socket */
if ((sFd = socket (AF_INET, SOCK_STREAM, 0)) == ERROR)
{
perror ("socket");
return (ERROR);
}
/* bind not required - port number is dynamic */
/* build server socket address */
sockAddrSize = sizeof (struct sockaddr_in);
bzero ((char *) &serverAddr, sockAddrSize);
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = htonl(ipaddr);
serverAddr.sin_port = htons (SERVER_PORT_NUM);
/* connect to server */
if (connect (sFd, (struct sockaddr *) &serverAddr, sockAddrSize) == ERROR)
{
printf("connect error!\n");
close (sFd);
return (ERROR);
}
printf("Connect to Server successfully!\n");
return sFd;
}
void tcpClose(int fd)
{
close(fd);
}
void tcpWrite(int fd, const char* cmd)
{
if (write(fd, cmd, strlen(cmd)) < 0 ||
(write(fd, "\n", 1) < 0))
{
printf("ERROR: tcpWrite() '%s'\n", cmd);
}
printf("tcp write successfully!\n");
}
char* tcpRead(int fd)
{
char *str = malloc(2000);
char *pos;
if (read(fd, str, 2000) <= 0)
{
printf("ERROR: tcpRead()\n");
}
if ((pos = strstr(str, "\n")) != NULL)
{
*pos = '\0';
}
printf("tcp read: [%s] successfully\n", str);
return str;
}
测试脚本:tcpReporting好好分析
displayComponentTypes
displayComponentTypes
loadComponent("Reporter","OCL::TcpReporting")
setActivity("Reporter",0.01,LowestPriority,ORO_SCHED_RT)
cd Reporter
start
displayComponentTypes
loadComponent("Reporter","OCL::FileReporting")
setActivity("Reporter",0.01,LowestPriority,ORO_SCHED_RT)