• 4694阅读
  • 4回复

Qt的函数和Linux的函数 [复制链接]

上一主题 下一主题
离线melodyarm
 

只看楼主 倒序阅读 楼主  发表于: 2006-09-17
Qt的函数和Linux的函数
void Form1::sendText()
{
  QString s1;
  s1=textEdit1->text();
//--------------------------------------------------------------------------------------





  if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
    perror("socket");
    exit(1);
  }
  my_addr.sin_family=PF_INET;
  my_addr.sin_port=htons(myport);
  my_addr.sin_addr.s_addr = INADDR_ANY;
  bzero(&(my_addr.sin_zero), 0);
  if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
    perror("bind");
    exit(1);
  }

  if (listen(sockfd, lisnum) == -1) {
    perror("listen");
    exit(1);
  }
  while(1) {
    sin_size = sizeof(struct sockaddr_in);
   new_fd=accept(sockfd,(struct sockaddr*)&their_addr,&sin_size);
   if (new_fd==-1)
   {
      perror("accept");
      continue;
     
   }
   
    printf("server: got connection from %s\n",inet_ntoa(their_addr.sin_addr));
    if (!fork()) {
        if (send(new_fd, s1, 14, 0) == -1) {
          perror("send");
          close(new_fd);
          exit(0);
        }
    }
    close(new_fd);
    waitpid(-1,NULL,WNOHANG);
  }

 
//--------------------------------------------------------------------------------------------
 

 
}
这段程序就是把textEdit1控件的内容发送出去,初学socket编程,出现的错误是:no matching   function for call to "accept()",发送字符串的代码在在别的程序中测试通过了,调用accept()没有问题。(此处大概是把accept看成是qt的函数了,因为qt中的accpt函数和Linux下的accpt函数的参数不同,所以说调用出错吧,在Qt中编程时,要是用到Linux 系统的函数,除了要包含头文件外,还要怎样标志是调用的Linux的而不是qt的函数呢?)

请高手指教,不胜感激!
离线seasonx
只看该作者 1楼 发表于: 2006-09-17
这个不是qt下的socket编程,qt有自己的类!
离线style
只看该作者 2楼 发表于: 2006-09-17
1)
#include
<sys/types.h>
<sys/socket.h>

2)
send(new_fd, s1, 14, 0) ;
函数原型是
send(int, const char *, int, int);
而s1是QString对象.并不是char*
qt能用到QString的地方都基本能用到char *,即qt/QString兼容C语言的char *
而C语言要用到char *的地方就不能用QString...即c/char*不兼容QString

更简单的说/
在C语言函数中,如果形参是char*,那么实参就必须为char*,而不能用QString
在QT库成员函数中,如果形参是QString,实参可以用QString,也可以用char*

所以楼主程序需要把QString转换成char *类型再带到send()参数中
离线melodyarm

只看该作者 3楼 发表于: 2006-09-19
这里好像不是send的问题,问题解决以后并没有做QString到char*的转换,我是在Qt中用的Linux的socket编程,当然也可以用Qt的socket的编程,主要是初学嘛,刚刚学会Linux的socket的编程,接下来会尝试Qt的socket的编程的。
问题是这样解决的:把两个//---------之间的代码剪切放到一个sendfuc.cpp文件中,相应编辑一个sendfuc.h文件,也就是说把Linux socket的编程的代码和Qt的代码分开,只是在
void Form1::sendText()
{
//QString s1;                 //注释掉,然后在sendfuc.h中把s1 定义为全局的
s1=textEdit1->text();
之后调用sendfuc();
这里把是s1定义成全局的变量了,在sendfuc()函数中的send(new_fd, s1, 14, 0) 引用s1做参数。

谢谢各位的解答,把最后解决的方法贴出来了,望以后还要多多指教!
离线style
只看该作者 4楼 发表于: 2006-09-19
有点不敢相信...C语言函数参数能接受QString

那你试试
QString s1;
s1 = textEdit1->text();

printf("%s",s1);
快速回复
限100 字节
 
上一个 下一个