• 6751阅读
  • 6回复

使用Qt tcpsocket 连接 远程linux服务器 只能连接一次 [复制链接]

上一主题 下一主题
离线seffrui
 

只看楼主 倒序阅读 楼主  发表于: 2014-12-23
client 使用Qt写的 远程的server使用 c语言写的 ubuntu 14.04 为什么 我只能连接一次  然后就断开连接了  

if((socket_fd=socket(AF_INET,SOCK_STREAM,0))==-1)
        {
                printf("socket create  failed \n");
                return -1;
        }
        memset(&mysocket,0,sizeof(mysocket));
        mysocket.sin_family=AF_INET;
        mysocket.sin_addr.s_addr=htonl(INADDR_ANY);
        mysocket.sin_port=htons(PORT);
        if(bind(socket_fd,(struct sockaddr*)&mysocket,sizeof(mysocket))==-1)
        {
                printf("bind error \n");
                return -1;
        }
        if(listen(socket_fd,10)==-1)
        {
                printf("listen failed \n");
                return -1;
        }
        printf("waiting for connect... \n");
        while(1)
        {
                if((connect_fd=accept(socket_fd,(struct sockaddr*)NULL,NULL))==-1)
                {
                        printf("accept error\n");
                        return -1;
                }
                n=recv(connect_fd,receive,BUFF,0);
                if(!fork())
                {
                        if(send(connect_fd,"Hello,you are connected!\n",26,0)==-1)
                        printf("send error\n");
                        printf("i have send \n");
                        close(connect_fd);
                        exit(0);
                }
                receive[n]='\0';
                printf("you have reveived message %s\n",receive);
                close(connect_fd);
        }
        close(socket_fd);
这是server端的测试程序

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->setFixedSize(300,500);
    send=new QPushButton(this);
    send->setText("发送消息");
    send->setGeometry(250,400,40,20);
    edit=new QTextEdit(this);
    edit->setGeometry(0,0,300,300);
    line=new QLineEdit(this);
    line->setGeometry(0,350,400,20);
    client=new QTcpSocket(this);
    client->connectToHost(QHostAddress("115.29.99.220"),4321);
    connect(client,SIGNAL(readyRead()),this,SLOT(get_message()));
    connect(send,SIGNAL(clicked()),this,SLOT(send_message()));
}
void Widget::send_message()
{
    qDebug()<<client->state();
    int c=client->write(line->text().toStdString().c_str());
}
void Widget::get_message()
{
    char temp[4096];
    int n=client->read(temp,4096);
    temp[n]='\0';
    QString name(temp);
    if(!name.isEmpty())
    edit->setText(name);
}

这是client端
然后这是
离线seffrui

只看该作者 1楼 发表于: 2014-12-23
离线dosmlp

只看该作者 2楼 发表于: 2014-12-23
因为你在while循环里面有个close(connect_fd);
所以每次接收完消息就关闭描述符了,
要重新连接
而且新的客户端连接要等上一个连接关闭才能连接服务端
离线seffrui

只看该作者 3楼 发表于: 2014-12-23
回 dosmlp 的帖子
dosmlp:因为你在while循环里面有个close(connect_fd);
所以每次接收完消息就关闭描述符了,
要重新连接[表情]
而且新的客户端连接要等上一个连接关闭才能连接服务端 (2014-12-23 10:54) 

我把close那句删了 也还是不行
离线begboy

只看该作者 4楼 发表于: 2014-12-23
seffrui,您好!
     根据您的描述,dosmlp讲法是对的。
     另建议如下:
      1、基于资源和安全性,目前Server端普遍采用短链接方式,
        QT编程尽量使用上述方式进行开发;
      2、从我们以往项目来看,在开发tcpip类的软件,建议尽量
        改用C/C++语言进行开发,方式既简单又稳定,特别是大规模
        数据交换时,尽量避免使用QT,特别是低版本的QT。

祝好运!
begboy
离线seffrui

只看该作者 5楼 发表于: 2014-12-23
回 begboy 的帖子
begboy:seffrui,您好!
     根据您的描述,dosmlp讲法是对的。
     另建议如下:
      1、基于资源和安全性,目前Server端普遍采用短链接方式,
        QT编程尽量 .. (2014-12-23 15:27) 

我的应该怎么改呢  不太熟悉linux c的server啊  
我把close(connect_fd)删了 也不好使啊  只能发送和接受一次数据
能帮我看看server端怎么改吗
离线dosmlp

只看该作者 6楼 发表于: 2014-12-23
回 seffrui 的帖子
seffrui:我的应该怎么改呢  不太熟悉linux c的server啊  
我把close(connect_fd)删了 也不好使啊  只能发送和接受一次数据
能帮我看看server端怎么改吗 (2014-12-23 15:34) 

不能接收新消息的原因是第一次接收完毕会回到while的开始,即accept()接受新连接,
这个函数是阻塞的,所以即使有新消息过来也接收不到
如果只有一个连接,可以在这个while里面再加个while循环读取消息,如果接收到特定的字符则关闭描述符跳出本循环,这样只能有一个客户端
快速回复
限100 字节
 
上一个 下一个