Articles of networking

如何旋转来自同一台机器的每个请求的IP地址

我的要求是为每个来自单机的http请求轮换ip地址。 假设我有一组注册的IP地址,是否可以在应用层面控制每个请求的IP? 谢谢 Jitendra

在boost库中查找收到的UDP消息的目标IP地址

我正在使用多播UDP消息。 我需要将接收到的数据包的目标IP地址与通道的多播地址进行比较,接收端应该正在侦听,以确保它不接收在不同的多播通道上多播的消息。 我知道我可以通过使用recvmsg()使用UNIX套接字find目标IP地址,然后执行下面提到的所有操作: 获取接收到的UDP数据包的目标地址 。 但我一直在使用boost库ASIO套接字,虽然有recvfrom()funcn对应的receive_from(),但我找不到与recvmsg()类似的function。 任何人都可以帮助我在这里..有没有办法find在接收数据包的目的IP地址在boost库?

TCP套接字从错误的端口接收

我有一个TCP套接字接收错误的目标端口的消息的问题。 操作系统是Ubuntu Linux 10.10,内核版本是2.6.31-11-rt,但是其他内核也是如此。 这个问题的C / C ++程序是这样做的: TCP服务器套接字正在侦听端口9000处的INADDR_ANY中的连接。 消息由recv(2)通过TCP消息接收器线程接收。 阅读消息后,连接没有closures,但线程将继续从同一个连接永远读取。 错误:TCP消息接收方也收到其他9000端口以外的消息。 例如,当一个远程的SFTP客户端连接到TCP消息接收者正在监听的PC时,它使得TCP消息接收者也接收到SFTP消息。 这是怎样的可能? TCP端口如何“泄漏”这种方式? 我认为SFTP应该使用22端口,对吧? 那么这些消息在9000端口是可以看到的呢? 更多信息: 同时还有一个原始套接字在另一个networking接口上侦听,接口处于混杂模式。 这可以有效吗? 消息接收之间的TCP连接没有closures。 消息监听器只是从套接字读取数据。 这真的是一个正确的方式来实现一个TCP消息接收器? 有没有人看过这样的问题? 提前致谢。 编辑: 好的,这是一些代码。 代码看起来是好的,所以主要的奇怪的是,一个TCP套接字如何接收数据发送到另一个端口? /// Create TCP socket and make it listen to defined port TcpSocket::listen() { m_listenFd = socket(AF_INET, SOCK_STREAM, 0) … bzero(&m_servaddr, sizeof(sockaddr_in)); m_servaddr.sin_family = AF_INET; m_servaddr.sin_addr.s_addr = htonl(INADDR_ANY); […]

将Android模拟器连接到远程系统

我有2个Ubuntu系统A和B. A的IP地址是192.168.0.5 B的IP地址是192.168.0.3 系统A运行Android模拟器。 我有一个TCP客户端应用程序必须与系统B进行通信。 由于Android应用程序只能“查看”本地主机(如10.0.2.2),因此客户端应用程序会将消息发送到端口Pb上的10.0.2.2。 现在我假设系统A应该看到它在本地主机上接收到的任何消息(例如仿真器的127.0.0.1是10.0.2.2)必须在端口Pb被转发到系统B 192.168.0.3。 因此我在系统A上设置了以下内容: echo“1”</ proc / sys / net / ipv4 / ip_forward sudo iptables -t nat -A PREROUTING -p tcp -s 127.0.0.1 -d 127.0.0.1 –dport Pb -j DNAT – 到目的地192.168.0.3:Pb 系统B运行IP为192.168.0.3的TCP服务器和端口Pb 在系统A和B上使用这些规则,我在系统A上启动android模拟器,然后在Andoid上启动TCP客户端应用程序。 Wireshark工具显示包到达127.0.0.1,但我的系统B服务器根本没有收到任何包:( 哪里不对? ——————– ————————– System A System B 192.168.0.5 wlan0 192.168.0.3 wlan0 127.0.0.1 lo 127.0.0.1 lo […]

在Linux内核模块中制作一个ICMP数据包

我正在尝试使用ICMP协议,并创build了一个用于分析ICMP数据包的Linux内核模块(仅当ICMP代码字段是幻数时才处理该数据包)。 现在要testing这个模块,我必须创build一个ICMP数据包,并将其发送到运行此分析模块的主机。 事实上,如果我可以实现内核本身(作为一个模块)将是很好的。 我在内核中寻找类似于packetcrafter的东西,我用googlesearch了很多文章,解释了数据包的生命周期,而不是创build它的教程。 用户空间packetcrafters将是我最后的手段,也是那些高度灵活的,像我将能够设置ICMP代码等。 而且我并不担心内核恐慌:-) !!!!! 任何包装制作的想法是受欢迎的。

自动3G调制解调器发现

背景 我目前正在使用Linux&C构build一个软件来自动同时build立和监控与多个3G调制解调器的连接。 目前这个工作还算不错。 我正在阅读/proc/tty/driver/usbserial文件来发现所有的GSM调制解调器。 然后我有一个调制解调器设备ID列表告诉我用于pppd的接口(ttyUSBX),以及用于AT命令(networking名称,RSSI等)的接口。 列表条目包含; 设备ID(12d1:1001),串口tty(3),modem tty(1) 这意味着对于设备12d1:1001 ,第一个ttyUSB关联应该用于调制解调器,第三个用于AT命令,第二个不用。 问题:我想要做的是删除这个列表的需要。 有什么方法可以轻松发现哪些接口应该用于AT命令,哪些用于调制解调器ppp链接?

即使对于“pktcount * pktsize”<SO_RCVBUF,linux套接字recv缓冲区数据包也会丢失

我正在发送icmp echo到C程序中的250个节点。 套接字是这样创build的 sfd = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP); 我有getsockopt SO_RCVBUF:262142。如果一个数据包需要84字节(包括IP,100bytes有线),262KB需要一个数据包,rcv缓冲区应该能够容纳262142/84 = 3120数据包 sysctl parameters (defaults) net.core.rmem_max = 131071 net.core.rmem_default = 113664 但是有10滴以上。 我发送所有的回应请求,然后使用recvfrom()来获取数据包。 答复数据包显然是在socket的rcv缓冲区中累积的,但是rcv缓冲区足够容纳3120个数据包。 数据包在接收主机的ehtereal中正确显示。 当我设置: sysctl -w net.core.rmem_max=1048576 and SO_RCVBUF to 2MB, the drops were 0. 这是为什么? 有几个队列在行动。 网卡环形缓冲区。 nic到内核que 每个socket rcv缓冲区 我想net.core.rmem_max只会改变每套接字rcv缓冲区。 任何链接正确的方向。 Platform Linux suse10/x86 网卡:英特尔公司PRO /无线2200BG – 增加更多 我禁用了上述无线接口,并开始使用有线接口以太网控制器:Broadcom公司的NetXtreme BCM5705M_2千兆以太网(rev 03)情况发生了重大变化。 […]

UDP多个套接字高效地接收数据和处理 – C&Linux

我必须从15个不同的客户端接收数据,每个客户端在5个不同的端口上发送。 共15 * 5个sockets。 为每个客户端口定义和修复。 例如客户端1,端口3001至3005.客户端2,端口3051至3055等。它们有一个共同点,即第一端口(3001,3051)用于发送命令。 其他端口发送一些数据。 收到数据后,我必须检查校验和。 跟踪recvd数据包,重新请求数据包,如果丢失,还必须写入硬盘上的文件。 限制我不能改变上面的devise,我不能从UDP更改为TCP。 阅读后我知道的两种方法是 asynchronous复用使用select()。 每个套接字线程。 我尝试了第一个,当我得到数据时,我被卡住了。 我能够接收数据。 我有一些处理这样做,我想启动一个线程为每个套接字(或)为套接字来处理(说所有第一个端口,所有第二等..ie3001,3051等)但是,如果客户端发送任何数据然后FD_ISSET成为真的,所以如果我开始一个线程,那么它成为每个消息的线程。 问题:如何在这里添加线程代码,说如果我包含pthread_create if(FD_ISSET ..)然后为我收到的每个消息,我创build一个线程。 但是我想要每个插槽的线程。 while(1) { int nready=0; read_set = active_set; if((nready = select(fdmax+1,&read_set,NULL,NULL,NULL)) == -1) { printf("Select Errpr\n"); perror("select"); exit(EXIT_FAILURE); } printf("number of ready desc=%d\n",nready); for(index=1;index <= 15*5;index++) { if(FD_ISSET(sock_fd[index],&read_fd_set)) { rc = recvfrom(sock_fd[index],clientmsgInfo,MSG_SIZE,0, (struct sockaddr *)&client_sockaddr_in, &sockaddr_in_length); […]

在send()(tcp套接字)调用中保证发送的数据的最小大小是多less?

select返回后,写入fd设置为一个TCP套接字。 如果我尝试在该套接字上发送数据,使用send api将一次发送的数据的最小保证大小是多less? 我明白,我必须运行一个循环,以确保所有的数据发送。 不过,我想了解什么是最低保证数据发送,为什么?

ppoll()与pselect()与多个线程

我想在multithreading程序中使用ppoll或pselect。 根据手册页( ppoll , pselect ),它们之间有显着的区别 – ppol被认为是使用(或者像使用sigprocmask一样),pselect使用pthread_sigmask。 而在sigprocmask手册页上是信息“在multithreading进程中未指定使用sigprocmask();请参阅pthread_sigmask(3)”。 这是否意味着,我必须使用pselect,而不是ppoll? 真的有区别,还是只有男人的差异/错误/不准确? 我刚刚发现,在我的系统的手册页中,pselect和ppoll都被描述为使用等价于sigprocmask。 pselect还是仅仅在人中有区别?