我想从嵌入式设备的特定TCP端口读取数据,然后将其发送到服务器。因此,我的整个设备都有一个连接到电路板的传感器,并且该传感器例如在TCP端口6000上发送一些数据。我的代码看起来像
// create socket
int sockrd = socket(AF_INET, SOCK_STREAM,0);
if(sockrd < 0)
{
std::cout<<"Can't create socket\n"<<std::endl;
exit(1);
}
// Name and bind socket
struct sockaddr_in addressrd;
addressrd.sin_family = AF_INET;
addressrd.sin_addr.s_addr = inet_addr("127.0.0.1");//Provide ip of the board
addressrd.sin_port=htons(6000); // TCP port of the board
bind(sockrd,(struct sockaddr*)&addressrd, sizeof(addressrd));
if(bind < 0)
{
std::cout<<"Can't bind properly\n"<<std::endl;
}
// declare a buffer to read from the tcp port of the device
char buffer[1024];
read(sockrd,&buffer,sizeof(buffer));
close(sockrd);
我不必担心服务器进程。我很难理解如何仅对嵌入式设备进行操作,这意味着只有我的嵌入式设备从其各自的tcp端口读取数据,然后将其发送到服务器。我的代码将在板上嵌入linux的处理器上运行。
答案 0 :(得分:0)
您正在尝试从未连接的端口读取数据。它会失败。你需要:
connect()
到对等方,在这种情况下,您不需要bind()
或listen()
位于端口,accept()
连接来自对等端。哪个是正确的取决于设备。目前你们两个都没做。
绑定到127.0.0.1的当前bind()
调用将阻止所有与外部的连接,如果您是客户端则应该删除,或者如果您是服务器则更改为绑定到INADDR_ANY
您还需要在read()
调用中添加错误检查,并修复其他错误检查,以便他们调用perror()
或朋友,这样您就可以获得实际的失败模式,而不是一些无用的消息你自己设计的。