当前位置:首页 » 编程软件 » qtsocket编程

qtsocket编程

发布时间: 2023-08-17 04:55:51

① QT 编程QTcpSocket 类write函数

if(m_httpAddress.isEmpty() || sendBuffer.isEmpty())
{
return 0;
}//服务器地址或者需要发送的数据为空直接返回
QTcpSocket socket;
socket.connectToHost(m_httpAddress, m_httpPort);//建立一个TCP连接,主机地址是m_httpAddress,端口号是httpPort
socket.setSocketOption(QAbstractSocket::LowDelayOption, 1);//优化为最低延迟,后面的1代码启用该优化。
if (!socket.waitForConnected())
{
return 0;
}
//等待连接,如果超过3s没有客户端连接将退出。
socket.write(sendBuffer);//开始传输数据
socket.waitForBytesWritten();
while (socket.waitForReadyRead(60000))//在6s内完成数据的传输
{
while (socket.bytesAvailable())
{
receiveBuffer += socket.readAll();
}//如果传输数据不为0,那么接受数据buffer加上该值
}
socket.close();//关闭I/O数据传输以及Tcp连接,并重置主机名和端口号

② 如何在qt中使用connect指令来写socket

C/C++ code/*server.h 就是server的头文件*/

#ifndef SERVER_H
#define SERVER_H

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <netdb.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/select.h>
#include <unistd.h>
#include <arpa/inet.h>

#include <qstring.h>
#include <qapplication.h>
#include <qthread.h>
#include <qsignal.h>
#include <qobject.h>
#include <qvariant.h>
#include <qdialog.h>
#include <qwidget.h>
#include "userevent.h"
#include "VPN_usr.h"

//# define RECVBUF 140
//# define BACKLOG 10

typedef struct data
{
char command[20];
char parm[20];
char context[100];
}Data;

class server : public QThread
{
public:
int new_fd;
unsigned char from_client[140];
UserEvent *usre;
QString str;
QObject test;
void set_target(QWidget *parent);
server();
~server();
void run();
void stop();
void VPN_encrypt_send();
void VPN_certification_send();

private:
Data pData;
volatile bool stopped;
QWidget *parent_m;
int err;
unsigned char c;
int i;
int reclen;
int sockfd;
int namelen;
int portnum;
int sin_size;
int addrsize;
struct sockaddr_in server_addr,client_addr,addr;
unsigned char to_client[140];
};
#endif

/*server.cpp */
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <netdb.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/select.h>
#include <unistd.h>
#include <arpa/inet.h>

#include <qapplication.h>
#include <qthread.h>
#include <qsignal.h>
#include <qobject.h>
#include <qdialog.h>
#include <qvariant.h>

#include"encrypt.h"
#include"certification.h"
#include "VPN_usr.h"
#include"server.h"
#include "userevent.h"

server::server()
{
portnum=5554;
stopped= false;
err=0;
new_fd=0;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
{
printf("error in socket!\n");
err=1;
}
namelen=sizeof(struct sockaddr_in);
bzero(&server_addr,namelen);
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(portnum);
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
bzero(&(server_addr.sin_zero),8);

if ((bind(sockfd, (struct sockaddr *)(&server_addr), namelen))<0)
{
printf(" error in binding!\n");
err=1;
}
printf("Already bind\n");
}

server::~server()
{
stopped =true;
}

void server::run()
{
while(!stopped)
{

if ((listen(sockfd, 10))<0)
{
printf(" error in listening!\n");
err=1;
}
printf("Listening now\n");
if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr), (socklen_t *)&sin_size))<0)
{
printf("error in accept!\n");
err=1;
}
if(new_fd!=0)
printf(" connected with client!\n");
printf("Starting communication with client %s .\n",inet_ntoa(client_addr.sin_addr));
addrsize=sizeof(struct sockaddr_in);
getpeername(new_fd,(struct sockaddr*)&addr,(socklen_t *)&addrsize);
bzero(to_client, 140);
bzero(from_client, 140);

if(recv(new_fd,&c,1,MSG_PEEK)==-1)
{
printf(" Error when accept data from client!\n");
close(new_fd);
}
if(c==0xff)
{
i=0;
while((reclen=recv(sockfd,&c,1,0)) > 0 && c!=0xfe)
{
from_client[i++]=c;
}
if(reclen<0)
{
printf(" Error when accept more data from client!\n");
close(new_fd);
}
else if(c==0xfe)
from_client[i]=c;
switch(from_client[1])
{
case 0x0a:
printf("receive sa data from client.\n");
//emit show_sa();
//QApplication::postEvent(parent_m, usre);
break;
default:
printf("the data is does not follow the protocal.\n");
break;
}

}

}
stopped = false;

}

void server::stop()
{
stopped =true;
}
/*其他的内容对你来说也没用了*/

③ qt socket编程问题,不能接收数据,懂的帮忙解答一下,谢谢了。

  1. 接收函数内,一开始就readAll(),已经把数据都读取了,所以后面就没有可读数据了,所以后面不用判断bytesAvaliables()。

  2. 接收的时候,不要直接接收到QString中。应该先读取一个长度值(quint16),再根据长度值去读取QByteArray,再把读取到的QByteArray放到QString中。然后再判断bytesAvaliables是否还有剩余。有剩余,就再接收长度值+QByteArray。。。。

热点内容
如何修改已经更改的密码 发布:2025-02-04 13:38:38 浏览:772
唐dm2021买哪个配置划算 发布:2025-02-04 13:38:38 浏览:626
真空压缩重 发布:2025-02-04 13:38:37 浏览:639
alias脚本 发布:2025-02-04 13:38:03 浏览:739
linux终端字符 发布:2025-02-04 12:52:40 浏览:734
c语言程序设计mobi 发布:2025-02-04 12:51:55 浏览:258
rsa算法c语言 发布:2025-02-04 12:50:36 浏览:784
阿里云服务器托管破解 发布:2025-02-04 12:47:43 浏览:256
汽车都有什么配置 发布:2025-02-04 12:42:51 浏览:457
ons解压密码 发布:2025-02-04 12:42:43 浏览:778