如何在linux下实现udp的linux 多进程编程方式

君,已阅读到文档的结尾了呢~~
关于UDP 发包的程序的几点要求如下,发包到指定地址和端口这些基本的要求就不说了, 主要说一下我的特殊要求。 这个发包程序的目的,其实是模拟发送一个协议数据包。 ...
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
在linux环境下,开发一个UDP通用的发包程序。也就是说接受端可以是
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口socket编程实现一个简单的多人通信(udp)_Linux_第七城市
socket编程实现一个简单的多人通信(udp)
在编server程序的时候,在用recvfrom接收信息时出现-1的情况,错误为Invalid argument,在给client_len赋值后问题解决.下面程序中用红字标示出server程序:&span style=&color:#333333;&&/*
* File Name: socket_udp_server.c
* Author: eagle
* Created Time:
18:43 */#include &stdio.h&#include &sys/types.h&#include &sys/socket.h&#include &netinet/in.h&#include &arpa/inet.h&#include &net/if.h&#include &unistd.h&#include &stdlib.h&#include &string.h&#include &sys/ioctl.h&int findclient(struct sockaddr_in client_address, struct sockaddr_in client[], int *client_num);int main(int argc, char *argv[]){ int server_socketfd, client_ int server_len,client_ struct sockaddr_in server_ struct sockaddr_in client_ struct sockaddr_in client[100];//记录客户端信息 int i, byte, client_num = 0; char recv[100], send[100];
/*create socket and bind*/ server_socketfd = socket(AF_INET, SOCK_DGRAM, 0); //创建socket对象 server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr(&127.0.0.1&); //主机ip server_address.sin_port = 9734;
//主机端口 server_len = sizeof(server_address); bind(server_socketfd, (struct sockaddr *) & server_address, server_len);
&/span&&span style=&color:#ff0000;&&client_len = sizeof(struct sockaddr_in);&/span&&span style=&color:#333333;&& memset(&client_address, 0, sizeof(struct sockaddr_in));while(1){ if((byte = recvfrom(server_socketfd, &recv, sizeof(recv), 0,
//从客户端接受消息
(struct sockaddr *)&client_address, //存储客户端地址信息
(socklen_t *)&client_len)) == -1) {
perror(&recvfrom&);
exit(EXIT_FAILURE); } if(findclient(client_address, client, &client_num) == 0) {
strcpy(send, &Welcome to chating room&);
if((byte = sendto(server_socketfd, &send, sizeof(send), 0,
(struct sockaddr *)&client_address,
(socklen_t)client_len)) == -1)
perror(&send&);
exit(EXIT_FAILURE);
} } //给刚加入的客户端发送确认信息 //printf(&recv:%s/n&, recv); //printf(&send:&); //scanf(&%s&, send); for(i = 0; i & client_ i++){
if(client[i].sin_port != client_address.sin_port) {
client_len = sizeof(client[i]);
if((byte = sendto(server_socketfd, &recv, sizeof(send), 0,
(struct sockaddr *)&client[i],
(socklen_t)client_len)) == -1)
perror(&send&);
exit(EXIT_FAILURE);
} }}// shutdown(client_socketfd, 2);// shutdown(server_socketfd, 2); return 0;}int findclient(struct sockaddr_in client_address, struct sockaddr_in client[], int *client_num){
if(client_num == 0) {//
client[0].sin_family = client_address.sin_//
client[0].sin_port = client_address.sin_
client[0] = client_
(*client_num)++;
return 0; //没有客户端信息 } else {
for(i = 0; i & (*client_num); i++) {
if(client[i].sin_port == client_address.sin_port)
return 1; //列表中有客户端的信息
client[i] = client_
(*client_num)++;
return 0; //没有客户信息 }}&/span&client程序: &多人通信的时候需要将client程序复制多份并,改变port值,红字标出/*
* File Name: socket_udp_server.c
* Author: eagle
* Created Time:
18:43 */#include &stdio.h&#include &sys/types.h&#include &sys/socket.h&#include &netinet/in.h&#include &arpa/inet.h&#include &net/if.h&#include &unistd.h&#include &stdlib.h&#include &string.h&#include &sys/ioctl.h&int main(int argc, char *argv[]){
int server_len,client_ struct sockaddr_in server_ struct sockaddr_in client_ int i, char recv[100], send[100];//char recv, /*hostip 本机ip地址*/ /*int inet_
char hostip[15]; inet_sock = socket(AF_INET, SOCK_DGRAM,0); strcpy(ifr.ifr_name, &wlan0&); if (ioctl(inet_sock, SIOCGIFADDR, &ifr) & 0)
perror(&ioctl&); strcpy(hostip, inet_ntoa(((struct sockaddr_in *)&(ifr.ifr_addr))-&sin_addr));*/ /*上面部分为获取本机ip*/ socketfd = socket(AF_INET, SOCK_DGRAM, 0); //创建socket对象 server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr(&127.0.0.1&); //主机ip server_address.sin_port = 9734;
//主机端口
server_len = sizeof(server_address);
client_address.sin_family = AF_INET;
client_address.sin_addr.s_addr = inet_addr(&127.0.0.1&); //主机ip client_address.sin_port = &span style=&color:#ff0000;&&9735&/span&;
//主机端口 client_len = sizeof(client_address); bind(socketfd, (struct sockaddr *) & client_address, client_len);while(1){ printf(&send:&); scanf(&%s&, send); if((byte = sendto(socketfd, &send, sizeof(send), 0,
(struct sockaddr *)&server_address,
(socklen_t)server_len)) == -1) {
perror(&send&);
exit(EXIT_FAILURE); } if((byte = recvfrom(socketfd, &recv, sizeof(recv), 0,
//从客户端接受消息
(struct sockaddr *)&server_address, //存储客户端地址信息
(socklen_t *)&server_len)) == -1) {
perror(&recvprom&);
exit(EXIT_FAILURE); } printf(&recv:%s/n&, recv);} shutdown(socketfd, 2); return 0;}
版权声明:本文为博主原创文章,欢迎转载,但请在醒目位置注明出处
&span&标签挨着写时的出现的
最新教程周点击榜
微信扫一扫linux下有什么办法可以获得进程的udp流量_问答_ThinkSAAS
linux下有什么办法可以获得进程的udp流量
linux下有什么办法可以获得进程的udp流量
我目前可以得到使用tcp协议的进程的流量, 使用netstat 得到一个 localip:port remoteip:port pid 对作为键值,
通过抓包获得localip:port remoteip:port databyte, 然后用抓包获得的localip:port remoteip:port与netstat的做比较, 遇到相同的 就 将databyte归入 该pid下,
但是 使用udp协议的进程 因为netstat无法获得remoteip:port 因此 上面的方法对udp协议无效. ps: 我用nc 使用udp 传送一个文件. netstat是可以看见该pid的. 但是对于QQ.exe 这种的udp , 只是发送一个很小的字节或者接收一个很小的字节. netstat就看不见了.
我也在/proc/pid/net/udp 下找过 也没有收获.
百合曾经告诉过我. 可以通过写内核模块来实现, 我也知道 所有进程的通信, 内核是肯定知道的, 但是我不知道如何 从内核获得这个信息.
如果可以的话. 你们帮我让我做一个伸手党吧 :D,
btw 我尝试用systamtap 可以获得QQ.exe的udp流量. 但是我总不能将systemtap包含进我的程序里面吧 :D
你可以参考一下,atop作者开发的一个用于监控进程的网络通信的内核模块netatop:
编译安装最新版atop:
tar xzf atop-2.1-1.tar.gz && cd atop-2.1
make && sudo make install
atop交互命令:
t(手动刷新,默认刷新间隔为10秒,i可以修改时间间隔) g(默认输出) d(磁盘) m(内存)
s(调度) v(可变) c(命令行) p(进程统计) u(用户统计) n(网络,需要内核模块netatop支持)
C(按CPU排序) M(按内存MEM排序) D(按磁盘DSK排序) N(按网络NET排序)
编译安装atop的网络内核模块netatop:
make && sudo make install
sudo service netatop start
atop里按n即可输出网络相关的信息.
模块位置: /lib/modules/uname -r/extra/netatop.ko
服务脚本: /etc/init.d/netatop
调用关系: netatop.ko =& netatopd =& atop
添加你想要问的问题
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
开发客服微信使用ip_conntrack实现UDP服务的多进程处理_Linux编程_Linux公社-Linux系统门户网站
你好,游客
使用ip_conntrack实现UDP服务的多进程处理
来源:Linux社区&
作者:dog250
UDP是无连接的,一个UDP包发出之后,对端接收到,事情就完了,即使对端没有接收到,事情也随之结束,两端都不会保存任何信息(UDP connect函数仅仅绑定了一个元组,不会对协议通信有影响)。因此无法像TCP那样实现accept。而TCP服务的多处理机制基本都是基于accept的,TCP的侦听socket只负责接受连接,进而调度给一个进程或者线程,accept/fork机制已经成了多处理的必杀技,由于UDP无法实现accept,也就很难实现多处理以及xinetd那样的服务调度程序,可是事情并没有完!
虽然UDP不保存任何连接信息,可是Linux内核Netfilter的nf_conntrack为之保存了一个连接,这个conntrack如果能被使用,那么就可以利用它实现UDP的多处理,接下来唯一的问题就是端口的问题。多进程的UDP服务必须绑定不同的端口(或者不同secondary IP的同一个端口),比如五个端口对应五个UDP服务进程,剩下的工作就是将客户端的访问定向到这五个服务中的一个:
iptables -t nat -A LBalance -p udp --dport $port_base -j DNAT --to-destination $LISTEN_ADDR:
这样就好了。NAT是有状态的,conntrack模块负责保持这个连接,且NAT仅仅对一个流的头包有效,这样就可以把同一个连接的数据定向到同一个进程了,唯一需要注意的就是,nf_conntrack模块对于保持的连接是有超时时间的,如果过了超时时间,连接数据结构就会被释放掉,因此如果不能保证数据持续传输的情形下,最好在应用层有一定的心跳机制。
何时?iptables可以拥有一个模块,可以将连接定向到一个进程,进程PID可以通过procfs或者sysfs设置,到那时,UDP服务就可以不绑定那么多的端口了。左右思索,觉得还是自己实现一个为好,可以参考TPROXY以及2.4内核Netfilter的owner-pid来实现,在HOOK function中可以有以下的片断:
& & & & struct task_struct *p;& & & & struct files_struct *& & & && & & & p = pid_task(find_get_pid(进程PID,可以通过procfs来配置), PIDTYPE_PID);& & & & if (!p)& & & & & & & && & & & task_lock(p);& & & & files = p-&& & & & if(files) {& & & & & & & & for (i=0; i & 目前打开的描述符; i++) {& & & & & & & & & & & & struct file *f = files-&fd_array[i];& & & & & & & & & & & & if (S_ISSOCK(f-&f_path.dentry-&d_inode-&i_mode)){& & & & & & & & & & & & & & & & 从file结构体中取出private_& & & & & & & & & & & & & & & & 从private_data映射到socket,进而取出sock结构体;& & & & & & & & & & & & & & & & 将sock结构体和skb关联;& & & & & & & & & & & & }& & & & & & & & }& & & & }& & & & task_unlock(p);
以上只是一个片断,其实还要和conntrack结合对应到具体的流,可能还需要mark机制。
如果一个技术本身没有提供某个机制,那么肯定有其它的层可以为之提供该种功能,这个层可以在上面也可以在下面,对于UDP,你可以在应用层为之封装一个层,类似OpenVPN或者DTLS那样,也可以利用底层的ip_conntrack。
相关资讯 & & &
& (04/20/:58)
& (09/28/:53)
& (01月14日)
& (11/18/:07)
& (06/06/:28)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款}

我要回帖

更多关于 linux 多进程编程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信