| 首页 | 学习 | 计算机 | 小说 | 动漫 | 论文 | 军事 | 科技 | 教育 | 哲学 | 历史 | 英语 | 笑话 | 
您现在的位置: 【书斋】 >> 计算机 >> 程序编程 >> 计算机正文 用户登录 新用户注册
使用UDP协议的echo核心守护进程           ★★
使用UDP协议的echo核心守护进程
昨天花了半天时间写了一个使用UDP协议的echo核心守护进程,请大家指正

/* Makefile */
all:echod.o

.c.o:
gcc -I/usr/src/linux/include -O2 -c $<
clean:
rm -f *.o



/* echod.c */
#define MODULE
#define __KERNEL__

#include <linux/config.h>

#if CONFIG_MODVERSIONS
#define MODVERSIONS
#include <linux/modversions.h>
#endif

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <asm/processor.h>
#include <linux/tqueue.h>
#include <linux/interrupt.h>
#include <linux/malloc.h>
#include <linux/net.h>
#include <net/sock.h>

#include <asm/uaccess.h>

struct timer_list tm;
DECLARE_WAIT_QUEUE_HEAD(wq);
DECLARE_WAIT_QUEUE_HEAD(wm);
volatile int finish = 0;
int port = 7;

int init_sock(struct socket **s, int port)
{
struct sockaddr_in sin;
int error = 0;

error = sock_create(PF_INET, SOCK_DGRAM, IPPROTO_UDP, s);
if (error < 0) {
printk("Error during creation of socketn");
goto out;
}
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons((unsigned short)port);

error = (*s) -> ops -> bind(*s, (struct sockaddr*)&sin, sizeof(sin));
if (error <0) {
printk("Error bindn");
goto out;
}

(*s) -> sk -> reuse = 1;

out:
return error;
}

void doecho(struct socket *s)
{
struct msghdr msg;
struct iovec iov;
int len;
char *buf;
struct sockaddr_in sin;
mm_segment_t oldfs;

if (skb_queue_empty(&(s ->sk -> receive_queue)))
return;

buf = (char *)kmalloc(4096, GFP_KERNEL);

msg.msg_name = (void *)&sin;
msg.msg_namelen = sizeof(sin);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
msg.msg_controllen = 0;
msg.msg_flags =0;

msg.msg_iov -> iov_base = buf;
msg.msg_iov -> iov_len = (size_t) 4095;

len = 0;
oldfs = get_fs();
set_fs(get_ds());
len = sock_recvmsg(s, &msg, 4095, MSG_DONTWAIT);
buf[len] = 0;
/* printk("recv: %s : %dn", buf, len); */
set_fs(oldfs);

if ((len < 0) || (len > 4094))
goto outdo;

oldfs = get_fs();
set_fs(get_ds());
msg.msg_control = NULL;
msg.msg_controllen = 0;
msg.msg_iov -> iov_base = buf;
msg.msg_iov -> iov_len = len;
msg.msg_flags = MSG_NOSIGNAL;
len = sock_sendmsg(s, &msg, len);
set_fs(oldfs);
outdo:
kfree(buf);
}

int echod(void *ptr)
{
struct socket *s = NULL;

sprintf(current -> comm, "echod");
daemonize();

if (init_sock(&s, port))
return -1;

printk("echod beginn");
while (!finish) {
doecho(s);
interruptible_sleep_on_timeout(&wq, 1);
}
sock_release(s);
printk("echod endn");
wake_up_interruptible(&wm);
return 0;
}

void tm_timeout(unsigned long ptr)
{
printk("wait up itn");
finish = 1;
}

MODULE_PARM(port, "i");

int init_module()
{
kernel_thread(echod, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGHAND);
return 0;
}

void cleanup_module()
{
tm_timeout(0);
interruptible_sleep_on(&wm);
}

[1]

[1]

在百度搜索:使用UDP协议的echo核心守护进程
  • 上一个计算机:

  • 下一个计算机:
  • 相 关 文 章
  • 一个简易的UDP Proxy程序

  • 文件系统和不同格式文件

  • 信号量使用方法的例子

  • 创建和使用库:静态、共

  • Using make to Simplify

  • linux 内核原代码 sched

  • Linux 下面使用 mtrace 

  • C语言进程vs线程选择

  • 在C语言下使用I/O端

  • C语言安全特性概要:进程

  • Linux 和 Unix 安全编程

  • 安全编程 HOWTO:文件

  • 使用C中自带的驱动去改变

  • Linux 守护进程的编程方

  • Linux下C语言编程--进程

  • Linux下C语言编程--进程

  • C语言中使用环境变量的技

  • Linux 下的多进程编程

  • Kernel Mechanisms (核

  • The Linux Kernel Sourc

  • Linux V2.2.X(i386体系

  • Scheduling (调度)

  • TCP/IP 协议

  • Make程式和重编核心

  • 创建和使用库:静态、共

  • 分析IDE硬盘驱动器读写过

  • Linux核心代码分析

  • Linux环境下的网络编程

  • 在MySQL数据库中使用C执

  • 使用 GDB 调试 Linux 软