• 4975阅读
  • 3回复

请教关于socket网络通信得问题。 [复制链接]

上一主题 下一主题
离线dxwang
 

只看楼主 倒序阅读 楼主  发表于: 2007-08-16
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
现在我用qt的自带的网络通信类写了c/s程序,运行正常,用标准socket写了c/s也正常。现在把qt的server和标准socket的client进行通信,连接请求可以收到,数据收不到(反之宜然), 都是用char * 作为通信参数的。下面是部分代码:
qt的c/s 代码:
     【server:】
        char *strHeadInfochar,*strDatachar;
        QString strHeadInfo,strData;
        QString DataLen;
        int uiDataLen;
        QDataStream in(clientPowerConnection);
        in.setVersion(QDataStream::Qt_4_2);
        in >>strHeadInfochar;
       strHeadInfo.clear();
       strHeadInfo.append(strHeadInfochar);
        cout<<"test...."<<endl;  ////////////////// just for test
        cout<<"strHeadInfochar="<<strHeadInfochar<<endl;////////////just for test
      if(Parse(strHeadInfo,strFileName,DataLen))
       {
         uiDataLen=DataLen.toInt();
         strDatachar=new char[uiDataLen];
         in >> strDatachar;
         strData.clear();
         strData.append(strDatachar);
       }
      else cout<<"not found #"<<endl;
     【client:】
     tcpSocket->abort();
    tcpSocket->connectToHost(QString("192.168.1.3"),12338);
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_2);
  /*  char *str,*strdata;    str=new char[50];    strdata=new char[250];*/ //right
    char str[50], strdata[250];
    strcpy(str,"Power#30");
    sprintf(strdata,"%d,%5.1f,%5.1f,%5.1f,%5.1f",122222,88.1,99.1,1000.1,1000.1);
    out << str;
    out<<strdata;
    tcpSocket->write(block);

标准socket的c/s 代码:
     【server:】
while(1)
  { sin_size=sizeof(struct sockaddr_in);
   if((new_fd=accept(sock_fd,(struct sockaddr *)&their_addr,&sin_size))==-1)
   {perror("accept"); continue;}
   if(!fork())
   { if(recv(new_fd,str,50,0)==-1) perror("recv1");
    fprintf(stderr,"str=%s\n",str);
    if(Parse(str,&datalen))
     { uidatalen=atoi(datalen);
       strdata=(char*)malloc(uidatalen*sizeof(char));
     }
    else {perror("datalen");exit(0);}
    if(recv(new_fd,strdata,uidatalen,0)==-1) perror("recv2"); 
    fprintf(stderr,"strdata=%s\n",strdata);
    free(strdata);
    close(new_fd); exit(0);
   }
  close (new_fd);
  waitpid(-1,NULL,WNOHANG);
  }
}
    【client:】
if( 0 > connect(white_sock,(struct sockaddr *)&me,sizeof(struct sockaddr)))
     printf("connect failed\n");
  char str[50];
  char strdata[200];
  sprintf(strdata,"%d,%5.1f,%5.1f,%5.1f,%5.1f",122224,88.1,99.1,1000.1,1000.1);
  sprintf(str,"Power#%d\0",strlen(strdata));
  send(white_sock,str,50, 0);
  send(white_sock,strdata,strlen(strdata), 0);

问题是当标准socket的client给qt的server发送数据的时候,console在打印完test...之后,就没有输出,StatusContext被更新成"parse return 0",此句cout<<"not found #"<<endl没有输出,直到将程序退出才输出strHeadInfochar=[root@dxwang server]# 
即最终结果为:
first length=82;
hello
strHeadInfochar=[root@dxwang server]#

请给你提示,谢谢!
[ 此贴被XChinux在2007-08-17 20:02重新编辑 ]
每天进步一点点
离线圆融一笑
只看该作者 1楼 发表于: 2007-08-17
为什么要这样混合呢
要么就全用QT
离线dxwang

只看该作者 2楼 发表于: 2007-08-17
因为我想在linux下用qt做个界面作为服务器,其他系统下用标准得socket写client。 qt下也可以用标准socket,但是我想既然它带有封装得socket想使用一下的。
每天进步一点点
离线dxwang

只看该作者 3楼 发表于: 2007-08-17
解决了,没有用QDataStream.,呵呵
每天进步一点点
快速回复
限100 字节
 
上一个 下一个