netfilter内核态与用户态 通信 之 sockopt(二)
ULE,
};
static int __init init_sockopt(void)
{
printk(KERN_INFO "sockopt: init_sockopt()\n");
return nf_register_sockopt(&test_sockops);
}
static void __exit exit_sockopt(void)
{
printk(KERN_INFO "sockopt: fini_sockopt()\n");
nf_unregister_sockopt(&test_sockops);
}
module_init(init_sockopt);
module_exit(exit_sockopt);
用户态的user.c
[cpp]
#include
#include
#include
#include
#include
#include
#define SOCKET_OPS_BASE 128
#define SOCKET_OPS_SET (SOCKET_OPS_BASE)
#define SOCKET_OPS_GET (SOCKET_OPS_BASE)
#define SOCKET_OPS_MAX (SOCKET_OPS_BASE + 1)
#define UMSG "----------user------------"
#define UMSG_LEN sizeof("----------user------------")
char kmsg[64];
int main(void)
{
int sockfd;
int len;
int ret;
sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
if(sockfd < 0)
{
printf("can not create a socket\n");
return -1;
}
/*call function recv_msg()*/
ret = setsockopt(sockfd, IPPROTO_IP, SOCKET_OPS_SET, UMSG, UMSG_LEN);
printf("setsockopt: ret = %d. msg = %s\n", ret, UMSG);
len = sizeof(char)*64;
/*call function send_msg()*/
ret = getsockopt(sockfd, IPPROTO_IP, SOCKET_OPS_GET, kmsg, &len);
printf("getsockopt: ret = %d. msg = %s\n", ret, kmsg);
if (ret != 0)
{
printf("getsockopt error: errno = %d, errstr = %s\n", errno, strerror(errno));
}
return 0;
}
Makefile----
系统不同命令可能不同,我的fedora 12
[cpp]
TARGET = socketopt
OBJS = module.o
MDIR = drivers/misc
EXTRA_CFLAGS = -DEXPORT_SYMTAB
CURRENT = $(shell uname -r)
KDIR = /lib/modules/$(CURRENT)/build
PWD = $(shell pwd)
DEST = /lib/modules/$(CURRENT)/kernel/$(MDIR)
obj-m := $(TARGET).o
$(TARGET)-objs :=$(OBJS)
default:
make -C $(KDIR) SUBDIRS=$(PWD) modules
gcc -o user user.c
$(TARGET).o: $(OBJS)
$(LD) $(LD_RFLAG) -r -o $@ $(OBJS)
insmod:
insmod $(TARGET).ko
rmmod:
rmmod $(TARGET).ko
clean:
-rm -rf *.o *.ko .$(TARGET).ko.cmd .*.flags *.mod.c modules.order Module.symvers .tmp_versions
-rm -rf protocol/*.o protocol/.*.o.cmd *.markers
-rm -rf user
-include $(KDIR)/Rules.make
运行的结果
[cpp]
[root@root socket]# make //编译
make -C /lib/modules/2.6.31.5-127.fc12.i686.PAE/build SUBDIRS=/root/study/c_study/socket modules
make[1]: Entering directory `/usr/src/kernels/2.6.31.5-127.fc12.i686.PAE'
CC [M] /root/study/c_study/socket/module.o
LD [M] /root/study/c_study/socket/socketopt.o
Building modules, stage 2.
MODPOST 1 modules
CC /root/study/c_study/socket/socketopt.mod.o
LD [M] /root/study/c_study/socket/socketopt.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.31.5-127.fc12.i686.PAE'
gcc -o user user.c
[root@root socket]#
[root@root socket]# make insmod //加载
insmod socketopt.ko
[root@root socket]#
[root@root socket]# lsmod //查看加载成功
Module Size Used by
socketopt 1968 0