• 9234阅读
  • 11回复

为什么qt4线程里连不上linux下的socket [复制链接]

上一主题 下一主题
离线cph315
 
只看楼主 倒序阅读 楼主  发表于: 2009-10-29
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
各位网络高手:
你们好!
我在项目中用到多线程,每个QThread线程创建一个socket并绑定到指定的网卡,由于qtcpsocket没有提供绑定网卡的接口,所以直接用linux中的socket,但是linux下的socket在主线程中能正常连接,可在子线程中却连不上,哪位大侠知道到为什么吗,请给一些解决的方法和建议
非常感谢!
离线shiroki

只看该作者 1楼 发表于: 2009-10-29
不可能的说, 肯定是程序写的有问题
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
离线cph315
只看该作者 2楼 发表于: 2009-10-30
我的程序如下:
class thread: public QThread
{
.
.
.
void run();
.
.
.
}
void thread::run()
{
int i=login();
.
.
.
}
在另一文件中
int login()
{
int m_sock=socket(...);
.
(设置超时、绑定网卡)
connect(m_sock,&dest_addr,sizeof(dest_addr));
.
.
.
}


代码大致是这样,可是我在run中调用login(),socket connect不上。
但在主线程中调用login()就能connect上。哪位知道原因的,麻烦告诉一声,谢谢啊。
离线cph315
只看该作者 3楼 发表于: 2009-10-30
还有一个问题:
在qt类中调用linux下和qt同名的函数该怎么实现,比如qt类里有connect()连接信号槽,linux下用connect连接socket,怎么在qt类中调用linux的connect呢,盼望各位能解答,非常感谢。
离线yanglisun
只看该作者 4楼 发表于: 2009-11-02
引用第3楼cph315于2009-10-30 16:19发表的  :
还有一个问题:
在qt类中调用linux下和qt同名的函数该怎么实现,比如qt类里有connect()连接信号槽,linux下用connect连接socket,怎么在qt类中调用linux的connect呢,盼望各位能解答,非常感谢。


c_head.h中的内容
  1 #ifdef __cplusplus
  2 extern "C"
  3 {
  4 #endif

.........
.....
......
  5 #ifdef __cplusplus
  6 }
  7 #endif
  8

第四行以后的....中写linux的头文件,然后然后将这个头文件包含到你要用到linux c函数调用的地方就可以了
离线yanglisun
只看该作者 5楼 发表于: 2009-11-02
楼主的sock的文件描述符是再函数中建立的,是临时变量,函数执行完就自动释放了..弄成外部变量或者用参数的形式传进来才可以哦
离线tsuibin

只看该作者 6楼 发表于: 2009-11-02
程序打包传上来
离线cph315
只看该作者 7楼 发表于: 2009-11-02
引用第5楼yanglisun于2009-11-02 13:43发表的  :
楼主的sock的文件描述符是再函数中建立的,是临时变量,函数执行完就自动释放了..弄成外部变量或者用参数的形式传进来才可以哦


yanglisun:
你好,谢谢你的回答,好像不是这个问题,我把他变成外部变量还是连不上,运行到connect就返回-1。
离线cph315
只看该作者 8楼 发表于: 2009-11-02
Thread::Thread (const char *pUser, const char *pPwd, const char *pIP, const char *pInterface,QObject *parent):
        QThread(parent)
{
    stoped=false;
    socketIsOk=false;
    svrIP=(char *)pIP;
    interFace=(char *)pInterface;
    user=(char *)pUser;
    pwd=(char *)pPwd;

     if ((m_sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  {
    printf("failed to create socket in login !\n");
  
    return ;
  }
void Thread::run()
{

char chUser[6] = "admin";
char chPwd[11] = "greenway";
char chIP[16] = "192.168.10.211";
char chInterface[9] = "eth0";
char chSerialNumber[16] = "GT812D081200205";

    login(m_sock,chUser, chPwd, chIP, chInterface) ;
  
    exec();
  
}

login在另一个文件
int login(int  sock,const char *pUser, const char *pPwd, const char *pIP, const char *pInterface)
{
    struct sockaddr_in  SockAddr;
    struct sockaddr_in  dest_addr;
    struct hostent *host;
    struct servent  *lpServent;
    unsigned long ulAaddr ;
    char *recvbuf ;
    char szCommand[256];
    struct timeval timeout;

    int m_sock=sock;
   recvbuf=new char[1024];

  
  
    PDEBUG("svrIP=%s,pInterface=%s\n",pIP,pInterface);

  memset(&SockAddr, 0, sizeof(SockAddr));

  lpServent = getservbyname("www", "tcp");
  SockAddr.sin_family = AF_INET;
  SockAddr.sin_addr.s_addr = inet_addr(pIP);
  SockAddr.sin_port = lpServent->s_port;

  timeout.tv_sec = 5;
  timeout.tv_usec = 0;



  //判断是主机名还是ip地址
  if ((ulAaddr = inet_aton(pIP, &(dest_addr.sin_addr))) == 0)
  { printf("3\n");
    if ((host = gethostbyname(pIP)) == NULL) //是主机名
    {
      printf("gethostbyname error in login !\n");
      return -1;
    }
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_port = lpServent->s_port;
    memcpy((char *)&dest_addr.sin_addr, host->h_addr, host->h_length);
    bzero(&(dest_addr.sin_zero), 8);
  }
  else
  {
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_port = lpServent->s_port;
    dest_addr.sin_addr.s_addr = inet_addr(pIP);
    bzero(&(dest_addr.sin_zero), 8);
  }


  //connecte server
  if (connect(m_sock, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr)) == -1)
  {
    printf("connect error in login !\n");
  
    close(m_sock);
    return -1;
  }
  PDEBUG("socket connect is ok\n");
离线cph315
只看该作者 9楼 发表于: 2009-11-02
这个程序到connet这里,在主线程中就能成功,在run中调用就失败,奇怪
离线cph315
只看该作者 10楼 发表于: 2009-11-03
connect错误原因是115,operation now in progress。有哪位知道为什么出现这个错误,怎么解决?
离线cph315
只看该作者 11楼 发表于: 2009-11-03
问题解决,是非阻塞的原因,继续等待就行,不是连接出错。
快速回复
限100 字节
 
上一个 下一个