标题:程序获取通过某个端口的UDP数据包
只看楼主
fightingsss
Rank: 6Rank: 6
等 级:侠之大者
帖 子:97
专家分:471
注 册:2010-11-12
结帖率:80%
已结贴  问题点数:20 回复次数:6 
程序获取通过某个端口的UDP数据包
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h> //for sockaddr_in
#include <sys/types.h> //for socket
#include <sys/socket.h> //for socket
#include <string.h>

#define MAX_LEN 256

static const int ITEM_COUNT = 100;

int main()
{
    int sock;
    if((sock = socket(AF_INET,SOCK_DGRAM,0))<0)
    {
        printf("create socket error!");
        return 0;
    }
    printf("socket sock=%d\n",sock);

    struct sockaddr_in addr;
    bzero(&addr,sizeof(addr));
    addr.sin_family=AF_INET;
    addr.sin_port=htons(13456);
    addr.sin_addr.s_addr=inet_addr("127.0.0.1");


    int r;
    int fd = sock;
    r=bind(fd,(struct sockaddr*)&addr,sizeof(addr));
    if(r==-1)
    {
        printf("Bind error!\n");
        close(fd);
        exit(-1);
    }
    printf("Bind successfully.\n");

    char buf[MAX_LEN];
    struct sockaddr_in from;
    socklen_t len;
    len=sizeof(from);
    while(1)
    {
        printf("准备接受数据··\n");
        bzero(buf,sizeof(buf));
        r=recvfrom(fd,buf,sizeof(buf),0,(struct sockaddr*)&from,&len);//成功则返回接收到的字符数,失败返回-1.
        printf("收到的字符数为%d\n",r);
        if(r<0)
        {
            break;
        }
    }
    close(fd);
    return 0;
}
发这个简单些的代码,想问个问题。
我用tcpreplay指令:tcpreplay -c udp.cache -p 10 -i eth1 -l 0 rewrite.pcap重发数据包
然后使用tcpdump -i eth1 udp and host 127.0.0.1也是能看到数据包的
为什么程序运行到recvfrom()处就一直阻塞在那了,一个字符都不去接收。。。
明明有那么多UDP数据包,源和目的地址是127.0.0.1,端口号也是一致的。
搜索更多相关主题的帖子: 数据包 
2013-08-13 17:30
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6809
专家分:42393
注 册:2010-12-16
得分:20 
tcpreplay 只是把数据打到网卡上面去的,tcpdump直接读网卡当然可以读取到。

你要直接读网卡才行,不应该这样直接监听端口。

我行我乐
我的博客:
http://blog.yuccn. net
2013-08-13 17:42
fightingsss
Rank: 6Rank: 6
等 级:侠之大者
帖 子:97
专家分:471
注 册:2010-11-12
得分:0 
回复 2楼 yuccn
Thanks,监听网卡不太会额,有没有什么NB点的资料,给点学习一下。
2013-08-13 19:14
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6809
专家分:42393
注 册:2010-12-16
得分:0 
直接读取网卡数据是有点麻烦的,你可以用第三方开源代码来实现,设置过滤条件。
如果从底层开始重组tcp包,那就更加麻烦了。你可以去查下wincap相关的资料,可能对你有用

我行我乐
我的博客:
http://blog.yuccn. net
2013-08-13 22:04
fightingsss
Rank: 6Rank: 6
等 级:侠之大者
帖 子:97
专家分:471
注 册:2010-11-12
得分:0 
回复 4楼 yuccn
好吧,我先去看看libpcap(wincap那是windows下的吧,我是在linux下运行的)吧。。。

[ 本帖最后由 fightingsss 于 2013-8-14 09:33 编辑 ]
2013-08-14 09:32
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6809
专家分:42393
注 册:2010-12-16
得分:0 
嗯,linux 是libpcap 。
你可以找一本《网络安全开发包详解》的书,里面有很多例子。
如果找不到,留个邮件地址我打包一份发给你。

[ 本帖最后由 yuccn 于 2013-8-14 15:44 编辑 ]

我行我乐
我的博客:
http://blog.yuccn. net
2013-08-14 11:21
FIRELARVA
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2013-8-13
得分:0 
求推荐几本书
2013-08-14 11:59



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-419036-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.076743 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved