Tag: sockets

如何确定select的最大fd?

就像标题一样简单,我希望得到最高的fd数作为第一个参数传递,但是使用FD_SETSISE似乎是如此低效和不必要。 我的假设是,在我的进程开始之后,创建的最新套接字将始终具有最高的fd编号,因此我可以简单地向其添加1并将其传递给select ,这是真的吗?

C套接字编程,服务器发送缓冲区似乎不被清除

我是socket编程的新手,我遇到了麻烦。 我想实现一个服务器,根据某个客户端请求回答。 在我的情况下,GET,HEAD或其他错误。 考虑以下代码 如果我在调用send()之前打印答案(参见下面的服务器端代码),则消息是正确的。 但是,我要从我发送的客户端说 得到 头 得到 测试 得到 ,从客户端打印的答案是 You want GET You want HEAD You want GETD HTTP/1.1 400 Bad Request You want GET Bad Request 因此,似乎从服务器发送的消息有点“覆盖”,但这怎么可以避免呢? 是否可以“清除服务器缓冲区”,如果这是问题呢? 这是完整的服务器端代码 #include #include #include #include #include #include #include #define BUFSIZE 1024 #define MAXPENDING 100 int main(){ char get[] = “GET”; char head[] = […]

TCP / IP传输期间套接字数据损坏

当我通过预先连接的TCP-IP套接字发送数据时,我发现数据已损坏。 例: Station1正在向Station2发送数据。 我在发送(S1)和接收(S2)之前打印了数据。 以下是消息: S1:发送的数据是ACK S2:收到的数据是AC 不确定是什么问题。 我甚至在发送数据之前(在S1处)和接收之前(在S2处)清除了char缓冲区。 任何上述提示/信息都会有很大帮助。

发现多个USB-IrDA设备,打开并连接每个插槽

对于任何好的套接字程序员: 是否可以使用套接字通过USB端口枚举连接到PC的多个活动IrDA设备? 如果是这样,怎么样? 这是我的主要问题。 该post的其余部分详细说明了我所尝试的内容。 我正在使用Microsoft SDK和ANSI C编译器在Windows 7上开发应用程序。 应用程序设计要求它检测范围内的任何IrDA设备,使用套接字连接,并通过多个IrDA加密狗(每个设备一个加密狗)与多个设备通信,每个加密狗通过USB连接到PC。 注意:应避免使用虚拟COM端口。 我已成功使用套接字调用来枚举 ,创建套接字,连接并与单个IrDA设备通信。 这很好用。 但是,我不确定如何设置代码以成功枚举多个IrDA设备。 到目前为止,我一次只能连接到一个设备。 即使很明显Windows正在“ 发现 ”三个IrDA加密狗,如下图所示 – 整体情景(第一张图片),设备管理器(第二张图片),设备属性(第三张图片): 图1:总体情况: 图2:从设备管理器: 图3:每个“找到的”IrDA设备的属性 (包含后两个箭头以显示所有三个设备的Port-Hub地址) 我正在使用的简单场景: (某些变量名称与上面的场景描述不同,但在代码中是一致的) 第一个 – 我将两个有效的IrDA设备放在两个加密狗的前面(由几英尺隔开,因此两个设备之间没有信号模糊)现在只使用2来保持简单。 第二 – 我创建了2个IrDA套接字,使用两个句柄:socket(AF_IRDA,SOCK_STREAM,0); 3号 – 我打电话: if ((errorCode = getsockopt(gSocketHandle[0], SOL_IRLMP, IRLMP_ENUMDEVICES, (char*)pDeviceList, &deviceListLength)) == SOCKET_ERROR) 4 – 然后我用pDeviceList和中的新信息填充destinIrdaDeviceAddr memcpy(&destinIrdaDeviceAddr.irdaDeviceID[0], &pDevList->Device[0].irdaDeviceID[0], 4); 5号 – 致电: […]

套接字编程:recv()

我有一个应用程序,其中各种实体通过套接字相互通信,我正在使用C编程语言。 当实体向另一个实体发送长消息时,recv()函数可能会部分地读取此消息。 因此,我必须通过附加所有收到的部分在接收方重新构建消息。 我的问题是与recv()相关的一般套接字编程问题。 recv()如何知道消息何时被完全读取? 我应该使用像“\ n”这样的特殊字符来终止消息吗? 或者我应该将邮件的大小作为标题发送? 常见的做法是什么?

BSD操作系统上的原始套接字

我一直在用C编写一些套接字代码。我需要修改数据包头并控制它们的发送方式,所以我采用了原始套接字方法。 但是,我写的代码不能在BSD系统上编译(Mac OS X / Darwin,FreeBSD等) 我已经对此进行了大量研究,并发现BSD系统无法像Linux(甚至Windows)那样处理原始套接字。 从我读过的内容来看,似乎我需要使用bpf(berkley数据包filter),但我无法弄清楚bpf是如何工作的,或者我将如何使用原始套接字。 如果有人能对这一点有所了解,我会非常兴奋:D PS我甚至会对一些显示如何在BSD环境中处理原始套接字的源代码感到满意。 它不一定是指导或解释。 我只想看看它是如何工作的。

套接字返回’没有这样的文件或目录“

Linux GCC 4.4.2 我正在做一些套接字编程。 但是,当我尝试从套接字函数分配sockfd时,我不断收到此错误。 ” Socket operation on non-socket” 非常感谢任何建议, #if defined(linux) #include /* Socket specific functions and constants */ #include #include #include #include #include #endif #include “server.h” #include “cltsvr_ults.h” /* Listens for a connection on the designated port */ void wait_client() { struct addrinfo add_info, *add_res; int sockfd; /* Load up the address […]

C套接字客户端/服务器滞后

我正在编写C / C ++客户端/服务器套接字应用程序。 此时,客户端每隔50ms将自身连接到服务器并发送消息。 一切似乎都有效,但数据流不是连续的:突然,服务器不再接收任何东西,然后一次收到5条消息……有时一切正常…… 有人知道这种奇怪行为的起源吗? 代码的某些部分: 客户: while (true) { if (SDL_GetTicks()-time>=50) { socket = new socket(); socket->write(“blah”); message.clear(); message = socket->read(); socket->close(); delete socket; time=SDL_GetTicks(); } } 服务器: while (true) { fd_set readfs; struct timeval timeout={0,0}; FD_ZERO(&readfs); FD_SET(sock, &readfs); select(sock + 1, &readfs, NULL, NULL, &timeout) if(FD_ISSET(sock, &readfs)) { SOCKADDR_IN csin; socklen_t […]

sockaddr_in未声明的标识符

我跟随beej的网络指南,它一直很好,因为我对一切都很了解,他解释得很好。 然而,当我想测试他向我展示的一些很酷的东西时,它将无法正常工作! 🙁 我不确定sockaddr_in的确切位置,但也许有人在这里帮助我! 这是我到目前为止(测试将字符串forms的ip转换为ip到4字节的积分,反之亦然): #include #include #include #include int main(void) { sockaddr_in sin; inet_pton(AF_INET, “192.168.2.1”, &sin.in_addr); char ip[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &sin.in_addr, ip, INET_ADDRSTRLEN); printf(“%s\n”, ip); return 0; } 对我来说,如果这对我来说真是愚蠢的话,我完全无能为力,对不起! 编辑:我正在使用名为Mint的Linux Debian发行版,如果它有帮助吗?

虽然c中没有数据,FD_ISSET会继续读取

我在监听多个套接字时遇到问题。 我有一个函数可以监听一堆套接字,但是当我测试并且只在1个套接字上发送数据时; FD_ISSET方法对每个套接字都保持返回true,并且缓冲区中没有数据返回给我没有发送数据的套接字(因为没有)。 我正在使用每个插槽进行发送和接收。 我究竟做错了什么 ? 编辑:发生的事情是printf语句打印多次,因为我只打印一次,因为我只在1个插槽上发送数据。 我在测试中添加了read()> 0的返回值,但它仍然没有乐趣。 void receive(struct nodeData *nd, struct sockInfo *si){ char buffer[MAXBUF]; struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 1000; // —-Wait in select until file descriptors change—- int y = select(si->maxFD, &si->fd_read_set, NULL, NULL, &timeout); printf(“ID: %d Y %d\n”, nd->id, y); if (y <= 0) return; for […]