[英]Problem sending data over socket from C++ server to Python client
[英]Sending data over socket from C server to qt Client
我在这里遇到了问题:
我有一个简单的C服务器(不能使用Qt TcpServer,这是嵌入式板的限制),它使用send()通过tcpsocket发送双倍数据(由GPIO端口生成) 。 如果我有一个简单的C客户端(在我的Linux PC中),那么我能够获取在recv()的帮助下生成的实时数据。 这是我的服务器代码:
int main (void){
int s,b,l,fd,sa,bytes,on=1;
char buf[BUF_SIZE],fname[255];
struct sockaddr_in channel;
long long sum=0;
double average=0;
int i,j;
int srno=0;
s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(s<0)
{
printf("socket creation failure");
exit(0);
}
setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&on,sizeof(on));
memset(&channel,0,sizeof(channel));
channel.sin_family=AF_INET;
channel.sin_addr.s_addr=htonl(INADDR_ANY);
channel.sin_port=htons(SERVER_PORT);
b=bind(s, (struct sockaddr *)&channel,sizeof(channel));
if(b<0)
{
printf("bind error");
exit(0);
}
listen(s,5);
while(1)
{
printf("waiting for request\n");
sa=accept(s,0,0);
if(sa<0)
{
printf("accept failure");
}
for (i=1; i<=56; i++) //for 10 sec >> 56
{
for(j=1;j<=20;j++)
{
//more than 100 lines of code here
}
average=(sum/20)*1.22;
send(sa, &average, sizeof(average), 0);
//int tmp = htonl((uint32_t)average); //tried this also
//send(sa, &tmp, sizeof(tmp), 0);
// int n = write(sa, &average, sizeof(average)) //and tried this also
// if(n<0){
// printf("error");}
printf("%lld \n", average);
srno++;
sum=0;
average=0;
}
}
remove_gpio();
close(s);
return 0;
}
但是我无法在Qt Client中显示数据,这使我发疯。 在我的QtextEdit中 ,无论尝试什么, 都会得到非ASCII字符。 在我的startRead()中
...
QByteArray Data = socket-> readAll();
ui-> textEdit-> append(QString(Data));
...
我也尝试过使用其他方法bytesavailable()canreadLine() ,并且也通过其他链接,但未成功。
我每次都会得到非ASCII疯狂字符。 抱歉,由于重复次数不足,无法提供图片。 我需要有关通过套接字发送双倍数据并能够使用该数据或至少将它们显示在QTextEdit / QPlainTextEdit中的帮助。
谢谢。
正如ciphor所说,您正尝试将二进制直接显示为文本
您将要使用数据流进行转换
QByteArray Data = socket->readAll();
QDataStream dstream (Data);
double d;
while(!dstream.atEnd())
{
dstream >> d;
ui->textEdit->append(QString::number(d));
}
您需要实际设计,指定和实现协议 。 否则,就好像您的客户说中文,而您的服务器在听西班牙语。 因为TCP是字节流协议,所以您需要精确地指定两个程序如何将数据作为字节流交换。 然后设计双方发送符合规范的字节流,并接收符合规范的字节流。 为了帮助您入门,您应该彻底研究TCP之上的现有协议的规范,例如IRC,NNTP,SMTP,IMAP等。
double
的转换说明符是"lf"
。
代码使用的"lld"
是long long integer
。
因此使用:
printf("%lf\n", average);
您正在以双精度二进制格式发送数据,但是试图在客户端中显示为字符串,这就是非ASCII的原因。
如果要发送ASCII,则应在服务器端发送数据之前将数据转换为字符串格式。
char buf[20] = {0};
average=(sum/20)*1.22;
sprintf(buf, "%lld", average);
send(sa, &buf[0], strlen(buf), 0);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.