小编Ton*_*ony的帖子

gcc 4.1.2:错误:整数常量对于'long'类型来说太大了

我编译了一段关于哈希函数的代码并得到了错误:整数常量对于'long'类型来说太大了.我做谷歌它,它说添加后缀"ULL",但我确实有ULL作为后缀.这个后缀仅由gcc 4.4.1支持,我在机器上只有gcc 4.1.2,我不允许安装新的编译器.有没有办法改变代码,以解决问题?

谢谢,-Tony

unsigned long long hash(string k){ //FNV hash
   unsigned long long x = 14695981039346656037ULL;
   for (unsigned int y=0;y<k.length();y++){
      x = x ^ (k[y]);
      x = x * 1099511628211;
   }
   return (x);
}
Run Code Online (Sandbox Code Playgroud)

c++ hash gcc g++

5
推荐指数
1
解决办法
7370
查看次数

Google协议缓冲交叉编译

我使用Google协议缓冲区的问题有两个部分,一个是关于编译器选项,另一个是交叉编译.构建机器是Power6,64bit; 主机是PowerPC450,32bit.Gcc 4.1.2.

第一个问题是关于编译器选项:

我正在尝试在需要交叉编译的PowerPC机器上安装Google协议缓冲区.构建机器是Power6,64bit; 主机是PowerPC450,32bit.首先,我尝试直接在构建机器上安装,并提供选项告诉编译器使用哪个:

./configure --prefix=/home/where_to_install --host=powerpc-bgp-linux
Run Code Online (Sandbox Code Playgroud)

然后制作,制作检查,安装,一切都很好.我认为我已经指定了主机,它应该包含编译需要知道的足够信息.当我尝试编译我的代码时

/bgsys/drivers/ppcfloor/gnu-linux/powerpc-bgp-linux/bin/g++ -g -zmuldefs -Xlinker -I/home/somewhere_installed/include $sourceFile -o $fileName -L/home/somewhere_installed/lib -lz -lstdc++ -lrt -lpthread -lm -lc -lprotobuf -lprotoc msg.pb.cc
Run Code Online (Sandbox Code Playgroud)

我得到了错误:

g++: unrecognized option '-zmuldefs'
In file included from zht_util.h:20,
                 from hash-phm.cpp:9:
meta.pb.h:9:42: error: google/protobuf/stubs/common.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)

并且没有发现很多关于common.h中的变量的错误.

我知道这是因为编译器无法识别选项-zmuldefs,因此无法找到确实存在的文件common.h.我用Google搜索并没有得到任何明确的想法.如何让编译器可以使用该选项或者可以找到该文件?或者我的编译命令有问题吗?


第二个问题是关于交叉编译.Google协议缓冲区的自述文件不清楚交叉编译的准确程度.它说我必须使用--with-protoc = protoc告诉配置使用哪个,好的,但在此之前我必须为主机安装一个副本.我首先使用该命令为主机安装副本

./configure --prefix=/home/where_to_install/built --host=powerpc-bgp-linux
Run Code Online (Sandbox Code Playgroud)

然后制作,安装.

然后用下面的交叉编译使用与主机相同的编译器:

./configure --prefix=/home/tonglin/Installed/built_3 CC=/bgsys/drivers/ppcfloor/gnu-linux/bin/powerpc-bgp-linux-gcc CXX=/bgsys/drivers/ppcfloor/gnu-linux/bin/powerpc-bgp-linux-g++ --host=powerpc-bgp-linux --with-protoc=/home/where_already_Installed/built/bin/protoc
Run Code Online (Sandbox Code Playgroud)

然后制造并得到错误:

很多编译信息... blabla .....

collect2: ld returned 1 exit status
make[3]: *** [protoc] Error 1
make[3]: …
Run Code Online (Sandbox Code Playgroud)

compiler-errors cross-compiling compiler-options

5
推荐指数
1
解决办法
1万
查看次数

Google协议缓冲区不适用于UDP?

我知道这可能很愚蠢,但我使用Google协议缓冲区定义的消息包并不能很好地与UDP一起使用UDP.当我通过UDP从客户端到服务器从序列化包(我只有一些普通字段)发送常规字符串时,每件事情都很好.但是当我添加一个重复的字段时,序列化的字符串只能被接收到整体的一部分.第一个字段将被完全接收,但所有其余字段将丢失.代码用c ++,Google协议缓冲区2.3.0,Linux编写.欢迎任何帮助.谢谢.

我的proto文件如下:

message Package{
    optional string virtualPath = 1;
    optional int32 num = 2;//0=insert, 1=find, 2=remove.
    optional string realFullPath = 3;
    optional bool isDir = 4;
    repeated string listItem = 5;
    optional int32 openMode = 6;
    optional int32 mode = 7;
    optional int32 Operation = 8;       
    optional int32 replicaNo =9; 
}
Run Code Online (Sandbox Code Playgroud)

服务器端:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include "zht_util.h"
int main(int argc, char *argv[]) {
    struct sockaddr_in sad; 
    int port = 50000; 
    struct sockaddr_in …
Run Code Online (Sandbox Code Playgroud)

c++ udp protocol-buffers

4
推荐指数
1
解决办法
6209
查看次数

如何在C/C++中进行TCP连接池

我正在设计一个带有C++的分布式服务器/客户端系统,其中许多客户端通过TCP向服务器发送请求,服务器抛出一个线程来处理请求并发回它的响应.在我的用例中,只有有限数量的客户端将访问服务器,我需要非常高的性能.从客户端和服务器发送的数据都很小,但非常频繁.因此,在使用后创建连接并将其拆除是很昂贵的.所以我想使用连接缓存来解决这个问题:一旦创建连接,它将被存储在缓存中供将来使用.(假设客户端的数量不会超出缓存的大小).

我的问题是:

  1. 我看到有人说连接池是一种客户端技术.如果此连接池仅用于客户端,则第一次连接到服务器并发送数据.此连接操作会触发服务器端的accept()函数,该函数返回用于从客户端接收的套接字套接字.因此,当客户端想要使用现有连接(在缓存中)时,它不会建立新连接,而只是发送数据.问题是,如果没有建立连接,谁会在服务器端触发accept()并抛出一个线程?
  2. 如果还需要在服务器端实现连接池,我怎么知道请求的来源?由于只能从accept()获取客户端地址,但同时accept()已经为该请求创建了一个新套接字,因此没有必要使用缓存连接.

任何答案和建议将不胜感激.或者任何人都可以给我一个连接池或连接缓存的例子?

c c++ connection tcp connection-pooling

3
推荐指数
1
解决办法
5181
查看次数