- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用 GCC 和 glibc 2.15 在 Ubuntu 12.04 上编译网络应用程序让我们以下面的代码为例:
a.cpp:
#include <sys/select.h>
void func ()
{
int fd;
fd_set fds;
FD_SET(fd, &fds);
}
我可以使用命令“gcc -c -Wsign-conversion a.cpp”成功编译这些行,但是在添加 -O1 或 -O2 选项后我收到以下警告:
gcc -c -O1 -Wsign-conversion a.cpp
a.cpp:6: warning: conversion to ‘long unsigned int’ from ‘int’ may change the sign of the result [-Wsign-conversion]
我收到了 gcc 4.4、4.5 和 4.6 的警告。
UPD:如果我理解正确,我的示例严格符合 FD_SET 语义,所以在这种情况下我应该没有警告。
这是什么原因?我该如何避免?
谢谢。
UPD:看起来这是现在的已知问题 - http://comments.gmane.org/gmane.comp.lib.glibc.alpha/22344 .但是我不明白我应该在 GLIBC 2.15 上用它做什么?只是等待下一个 GLIBC?
最佳答案
为了解决这个问题,我使用了一个单独的包装器源文件,并仅针对该源文件禁用了警告。
CMacroWrapper.h:
#include <sys/select.h>
namespace CMacroWrapper
{
void FdSet(int fd, fd_set *set);
}
CMacroWrapper.cpp:
#include "CMacroWrapper.h"
#pragma GCC diagnostic ignored "-Wsign-conversion"
void CMacroWrapper::FdSet(int fd, fd_set *set)
{
FD_SET(fd, set);
}
主要.cpp:
#include "CMacroWrapper.h"
void func ()
{
int fd;
fd_set fds;
FD_ZERO(&fds);
CMacroWrapper::FdSet(fd, &fds);
}
我发现 CMacroWrapper 命名空间对于添加在编译器警告中弹出的任何新系统 header 宏很有用。它确实添加了一个额外的函数调用,但为了警告安心,这是值得的。或者,如果您愿意,您可以包装所有 FD_ 宏以保持一致性。
关于linux - GCC 警告 FD_SET 调用上的符号转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10960569/
我遇到了 FD_SET 使我的程序崩溃的问题。我正在运行来自 boost Boost ASIO sample HTTP Server 的示例代码.在请求处理程序中,我放置了一个第三方 api,最终会进
**编辑:我找到了解决方案。** 对于那些敢于阅读以下内容的人,我有一个奇怪的问题: 我正在做家庭作业,需要使用 UNIX 管道在进程之间发送消息。 我对这段代码的意图是对提供的文件描述符进行 sel
我想知道是否有一种简单的方法可以遍历 fd_set?我想这样做的原因是不必遍历所有连接的套接字,因为 select() 将这些 fd_set 更改为仅包含我感兴趣的那些。我也知道,使用不打算直接访问的
我有以下 C 代码,用于设置 select() 以监听 TCP 套接字和消息队列上的传入数据: fd_set readSet; u32 maxFD = 0; mqd_t parentQueue; in
嗨,现在我想知道客户端或服务器是否断开连接,然后发送错误,但我似乎无法让它工作,我不知道该怎么做,所以我真的需要帮助 plz 这是我的代码 #ifdef _WIN32 || _WIN64
我的代码有问题,我无法找出问题所在,因为我是 select() 的新手; 谁能告诉我问题出在哪里? run_fct.c: In function ‘run’: run_fct.c:22: error:
我在编写我的第一个带有单选调用的异步服务器时遇到了这个问题: if( (retv = select((hsock 0) { printf("select() ended...\n");
我在 Linux 中有一个工作代码,正在移植到 Windows。它使用套接字库。 当我声明 fd_set xyz 时,它通过一个错误提示 error C2065: 'xyz' : undeclared
我在两个 UDP 套接字上有一个 select。有时 select 返回 2,因此两个套接字都已准备好接收,但我想首先接收可读取的最旧消息。有什么方法可以存档吗? 我需要首先获取最先到达的消息: 消息
如果当我在 select 系统调用中使用的 rdset 中放置一个连接描述符时,客户端关闭了该描述符,因此在调用 select 时它已经关闭,它是否仍会被选中并读取/在上面写上 return 0? 还
我目前正在处理的应用程序是一个服务器,它将使用 select() 管理与客户端的连接,每次服务器收到消息时,它都会打开一个新线程以读取套接字。在此期间,套接字的文件描述符从集合中删除,并将在读取结束时
我知道这不是出现此错误的第一个线程,但我真的无法理解问题所在...我的代码如下: /* File descriptor sets */ struct descs { fd_set read;
最近被FD_SET缓冲区溢出咬了两次。第一次是我们有太多套接字 (1024+) 添加到 FD_SET 中。这是一个测试用例,我们已将其禁用,并添加 assert 来检测此用例。 今天,当我们运行一个测
根据这篇文章poll vs select vs event-based : select() only uses (at maximum) three bits of data per file de
我有一个关于向 FDSET 添加新套接字文件描述符的问题。假设我们已经连接到套接字 s1: fd_set readfds; //s1 = socket(...); //connect(s1, ...)
我正在编写一个使用 select() 的程序,给定一个要读取的 fd_set。 在程序中,我保存了两个 fd_sets: 1. fd_set 名为 DB,包含我可以处理的所有 fd。 2. fd_se
我正在开发一个多客户端 Unix Domain Socket,以通过多个进程传输数据。我找到了一些实现每个客户端和其他东西之间聊天的代码,但我希望一旦客户端向服务器发送某些内容,服务器就会回复并断开客
我不是网络编程专家。我基本上有两种客户,他们有不同的超时时间。我应该使用带有连接套接字的 UDP 来进行客户端-服务器通信。 问题是双重的: a) 无论哪个客户端(或者套接字)在 t1 秒内没有响应,
我正在使用 select() 来衡量服务器没有收到任何新消息的时间。代码非常简单,看起来像这样: int res = -1; do { FD_ZERO(&readfds); FD_SE
我试图了解套接字编程和处理多个连接时的不同做法。特别是当服务器需要为多个客户端提供服务时。 我看过一些代码示例;其中一些使用 fd_set 而另一些使用 fork() 系统调用。 大致: FD_SET
我是一名优秀的程序员,十分优秀!