LINUX下QT+googleprotobuf+socket

最近准备毕业,就一直闲着。在公司实习时候跟着华哥和强哥接触了googleprotobuf,感觉这东西是个好东西,但是当时网龙公司把底层都做好了,接触的就是直接调用他们做好的接口。自己也不懂socket之类的网络编程,现在准备往上海那边找工作,就自己琢磨琢磨下。

因为个人原因,我比较喜欢linux系统,就选用了linux平台的QT来做这个demo。用linux安装东西也方便很多。

首先我们来安装googleprotobuf


wget http://protobuf.googlecode.com/files/protobuf-你的版本号.tar.gz


tar zxvf protobuf-你的版本号 .tar.gz


cd protobuf- 你的版本号


./configure --prefix=/usr/


make


sudo make install


/sbin/ldconfig -v

最后一条命令是为了避免在使用protoc命令时出现库的问题。

现在我们来写一个proto文件,命名为:QTPeople.proto,内容如下:

packageQTpeople;

messagePeople

{

required string name=1;

required int32 ID=2;

required string passwd=3;

}

现在我们需要生成h和cc文件,命令如下:

protoc-I=. --cpp_out=./ QTPeople.proto(这个命令的参数意义manprotoc就查到了)

QTPeople.pb.cc

QTPeople.pb.h

QTPeople.proto
 现在我们使用QT来新建两个项目,分别命名为:QtprotoC、QtprotoS,并在pro文件里面添加LIBS +=-L /usr/lib-lprotobuf,

因为这个是测试的demo,我就直接使用项目生成的main文件,在main文件内include QTPeople.pb.h

文件。

QtprotoC的main文件内容如下:

#include <QCoreApplication>

/*

-----懂得沉默------

*/

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

#include <sys/types.h>

#include <netinet/in.h>

#include<arpa/inet.h>

#include <unistd.h>

#include <sys/socket.h>

#include <sys/wait.h>

#include <iostream>

#include<QDebug>

#include "QTPeople.pb.h"

#define MAXSIZE 1024

#define SERVERIP "127.0.0.1"

#define SERVERPORT 2236

#define DATA "this is guest"

using namespace std;

void Client()

{

int Mysock,recvbytes;

string data;

char buf[MAXSIZE];

struct sockaddr_in ServerAddr;

QTpeople::People peo;

peo.set_id(1002);

peo.set_name("def");

peo.set_passwd("1234567");

peo.SerializeToString(&data);

char sendmsg[MAXSIZE];

strcpy(sendmsg,data.c_str());

if((Mysock=socket(AF_INET,SOCK_STREAM,0))==-1)

{

qDebug()<<"Sockt error";

exit(-1);

}

bzero(&ServerAddr,sizeof(ServerAddr));

ServerAddr.sin_family=AF_INET;

ServerAddr.sin_port=htons(SERVERPORT);

ServerAddr.sin_addr.s_addr=inet_addr(SERVERIP);

if (connect(Mysock, (struct sockaddr *)&ServerAddr,sizeof(struct sockaddr)) == -1)

{

qDebug()<<"Connect error";

exit(-1);

}

write(Mysock,sendmsg,sizeof(sendmsg));

if((recvbytes=recv(Mysock,buf,MAXSIZE,0))==-1)

{

qDebug()<<"received error";

exit(-1);

}

qDebug()<<"sucess";

buf[recvbytes]=‘\0‘;

string getmsg=buf;

cout<<getmsg<<endl;

bool isGet=peo.ParseFromString(getmsg);

qDebug()<<isGet;

cout<<"id="<<peo.id()<<endl;

cout<<"name="<<peo.name()<<endl;

cout<<"passwd="<<peo.passwd()<<endl;

close(Mysock);

// google::protobuf::ShutdownProtobufLibrary();

}

int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv);

Client();

return a.exec();

}

QtprotoSmain文件内容如下:

#include <QCoreApplication>

/*

-----懂得沉默------

*/

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

#include <sys/types.h>

#include <netinet/in.h>

#include<arpa/inet.h>

#include <unistd.h>

#include <sys/socket.h>

#include <sys/wait.h>

#include <iostream>

#include<QDebug>

#include "QTPeople.pb.h"

#define SERVPORT 2236

#define BACKLOG 10

#define MAXSIZE 1024

using namespace std;

void server() {

int sockfd, client_fd;

string data;

struct sockaddr_in my_addr;

struct sockaddr_in remote_addr;

QTpeople::People peo;

peo.set_id(1001);

peo.set_name("abc");

peo.set_passwd("7654321");

peo.SerializeToString(&data);

char sendmsg[MAXSIZE];

strcpy(sendmsg,data.c_str());

//创建套接字

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) ==-1) {

perror("socket create failed!");

exit(1);

}

//绑定端口地址

my_addr.sin_family = AF_INET;

my_addr.sin_port = htons(SERVPORT);

my_addr.sin_addr.s_addr = INADDR_ANY;

bzero(&(my_addr.sin_zero),8);

if (bind(sockfd, (struct sockaddr*) &my_addr, sizeof(my_addr))== -1) {

perror("bind error!");

exit(1);

}

//监听端口

if (listen(sockfd, BACKLOG) == -1) {

perror("listen error");

exit(1);

}

qDebug()<<"before while ok";

while (1) {

qDebug()<<"while first ok";

socklen_t sin_size = sizeof(remote_addr);

qDebug()<<"before accept ok";

/*     if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr,&sin_size)) ==-1){

perror("accept error!");

continue;

}

*/

client_fd=accept(sockfd,(struct sockaddr *)&remote_addr,&sin_size);

qDebug()<<client_fd;

if(client_fd==-1)

{

perror("accept error");

continue;

}

qDebug()<<"accept ok";

// client_fd = accept(sockfd, (struct sockaddr *)&remote_addr,&sin_size);

printf("Received a connection from %s\n", (char*)inet_ntoa(remote_addr.sin_addr));

qDebug()<<"before fork ok";

//子进程段

if (!fork()) {

qDebug()<<"fork ok";

//接受client发送的请示信息

int rval;

char buf[MAXSIZE];

if ((rval = read(client_fd, buf, MAXSIZE)) < 0) {

perror("reading stream error!");

continue;

}

qDebug()<<"read ok";

buf[MAXSIZE]=‘\0‘;

string getmsg=buf;

bool isGet=peo.ParseFromString(getmsg);

qDebug()<<isGet;

cout<<"id="<<peo.id()<<endl;

cout<<"name="<<peo.name()<<endl;

cout<<"passwd="<<peo.passwd()<<endl;

//向client发送信息

if (send(client_fd,sendmsg, strlen(sendmsg), 0) == -1)

perror("send error!");

close(client_fd);

exit(0);

}

close(client_fd);

}

close(sockfd);

}

int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv);

server();

return a.exec();

}

时间: 2024-10-13 15:57:44

LINUX下QT+googleprotobuf+socket的相关文章

Linux下高并发socket最大连接数所受的各种限制(详解)

1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄).可使用ulimit命令查看系统允许当前用户进程打开的文件数限制: [[email protected] ~]$ ulimit -n1024 这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中

Linux下高并发socket链接数测试

一.如何增大service进程的max open files ulimit -n 只能改小max open files,不能改大.需要按照以下步骤: 修改/etc/security/limits.conf文件,将"soft nofile 655360"和"hard nofile 655360"这两行的655360改成期望的值 退出,重新ssh该机器(否则无效) 修改对service的启动脚本,增加"ulimit -n 950000",其中9500

linux下C语言socket网络编程简例

转自:http://blog.csdn.net/kikilizhm/article/details/7858405 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后打印出来,然后关闭.程序里有详细的说明,其中对具体的结构体和函数的实现可以参考其他资料. 程序说明: 这里服务器的端口号和ip地址使用固定的设置,移植时可以根据具体情况更改,可以改写为参数传递更好,这里为了方便,使用固定的. 移

Linux下Qt的安装与配置

参考资料:http://www.cnblogs.com/emouse/archive/2013/01/28/2880142.html Linux 下编译.安装.配置 QT 下载qt 这里用的是4.7.0版本 qt-everywhere-opensource-src-4.7.0.tar.gz 拷贝并解压 这里我装的是Vmware上面的linux,所以windows与linux直接的文件共享,建议用samba,Samba我前面的笔记有介绍,这里不详谈. 拷贝到下面这个目录下 解压用 : tar zx

linux下Qt调用非标准库中的函数调用----------如pthread_create、pthread_cond_***、、

在Linux下Qt中使用POSIX标准的pthread_creaet函数调用创建新线程,使用如下代码后编译通过 extern "C" { #include <pthread.h> } 但是运行后发现并未成功创建新线程,并且无报错!!! (编译链接时有添加:-lpthread) 其中原因本人尚不清楚... 并且pthread_mutex_*** (互斥锁).pthread_cond_*** (条件变量) 等相关函数估计也无效... 后来借鉴网友提供的方法:将C文件创建成函数库

Linux下简单的socket通信实例

Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Bruce Lee       学习网络编程也一段时间了,刚开始看<UNIX网络编程>的时候,觉得这本厚厚的书好难啊!看到后来,发现并没有想象中的那么难.如果你是新手,建议你看到第二部分结束后,开始着手写代码.不写代码肯定是不行的.看100遍也没有敲一遍实现一遍来的清楚.敲完以后,带着问题去看书,你会

Linux下QT中执行shell命令

当需要在QT中执行shell命令时可以利用以下方法: (1)首先包含头文件: #include <QProcess> (2)执行shell命令: QProcess::execute("ls"); ///////////////////// #include  <QProcess> void Widget:on_pushButton_clicked() { //* system("ls");//调用LINUX C函数库中的system(cons

Linux下Qt应用程序的发布(使用LDD命令查看所有依赖的库文件)

最近一直在学习Qt,用Qt写了一个程序,但是不知道怎么发布,网上说的都是在windows下怎么发布Qt应用程序,但是,在windows下Qt应用程序依赖的库文件与linux下的名字不同.于是,我就想到Linux下有没有这么一个命令,能够找到一个可执行文件运行时所依赖的库文件,百度一下,还真的有ldd命令. ldd的作用是打印可执行文件依赖的共享库文件,它是glibc的一部分: [email protected]:~# ldd --helpUsage: ldd [OPTION]... FILE..

解决Linux下Qt程序报『QString::arg: Argument missing: 无法解析SSLv2_client_method中的符号』错误

在Linux开发Qt应用,程序会报这样的错误: QString::arg:Argument missing: 无法解析SSLv2_client_method中的符号"SSLv2_client_method":ssl,(/lib/x86_64-linux-gnu/libssl.so.1.0.0: undefined symbol: SSLv2_client_method) QString::arg:Argument missing: 无法解析SSLv2_client_method中的符号