免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3925 | 回复: 3
打印 上一主题 下一主题

使用sys_recvfrom和sys_sendto,编译提示undefined [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-10 12:23 |只看该作者 |倒序浏览
代码如下:
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/smp_lock.h>
#include <linux/types.h>
#include <linux/net.h>
#include <net/sock.h>
#include <linux/in.h>
#include <asm/socket.h>
//#include <linux/net.h>

#include <linux/syscalls.h>
//#include <sys/socket.h>


#define PKT_LEN    1500

static struct socket *ksock;
static int sockfd;
mm_segment_t fs;
struct ifreq ifr;

int handle_packet(void *arg)
{
    struct ifreq ifr;
    struct sockaddr_ll saddr;

    char buff[PKT_LEN];
    int len = 0;

    int saddr_len = sizeof(saddr);
    int ret;

    memset(&saddr, 0, sizeof(struct sockaddr_ll));
    saddr.sll_ifindex = ifr.ifr_ifindex;
    saddr.sll_family = PF_PACKET;

    ret = sys_recvfrom(sockfd, buff, PKT_LEN, 0, (struct sockaddr *)&saddr, &saddr_len);
    printk("recv len:%d\n", ret);
   

    //sys_recv(sockfd, buff, PKT_LEN,0);

    for ( ;; ) {
        printk("handle packet ... \n");
        //sleep(5);
        break;
    }

    ret = sys_sendto(sockfd, buff, len, 0, (struct sockaddr *)&saddr, saddr_len);
    printk("send len:%d\n", ret);

    //sock_release(ksock);
    //set_fs(fs);
   
    return 0;
}


int socket_init(void)
{
    pid_t pid;
    int ret;

    //sys_chdir("tmp"); // test sys_* func

    ret = sock_create(PF_PACKET, SOCK_RAW, __constant_htons(ETH_P_ALL), &ksock);
    if (ret < 0) return -1;

    printk("socket create succeed\n");
    fs = get_fs();
    set_fs(KERNEL_DS);

    //strcpy(ifr.ifr_name, ifname);
    memset(&ifr, 0, sizeof(ifr));
    strcpy(ifr.ifr_name, "eth0");
    ret = ksock->ops->ioctl(ksock, SIOGIFINDEX, (unsigned long)&ifr);
    if (ret < 0) return -1;

    printk("ifindex:%d\n", ifr.ifr_ifindex);
    printk("socket set succeed\n");
    sockfd = sock_map_fd(ksock);

    //pid = kernel_thread(&handle_packet ,NULL,CLONE_KERNEL);
    //if (pid < 0) return -1;


    sock_release(ksock);
    set_fs(fs);
   
    return 0;
}

int init_module(void)
{
    int ret = socket_init();
    if (ret == 0)
        printk("socket module succeed...\n");
    else
        printk("socket module failed...\n");

    return 0;
}

void cleanup_module(void)
{
    //sock_release(ksock);
    //set_fs(fs);
    printk("socket module exit...\n");
}


编译的时候,提示Warning: "sys_sendto" [/root/sock_kern.ko] undefined!
                       Warning:  "sys_recvfrom" [/root/sock_kern.ko] undefined!

inmod时,提示insmod: error inserting 'sock_kern.ko': -1 Unknown symbol in module


是不是不能调用sys_sendto、sys_recvfrom函数,还是缺少什么

论坛徽章:
0
2 [报告]
发表于 2012-08-17 09:05 |只看该作者
楼主这个问题解决了没,怎么回事呀

论坛徽章:
0
3 [报告]
发表于 2012-08-18 15:49 |只看该作者
改成sendto和recvfrom,这才是UDP的传送和接受函数。。。

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
4 [报告]
发表于 2012-08-18 17:33 |只看该作者
写核心模块么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP