Thursday, April 21, 2005

Linux Kernel Socket

這陣子由於某些特殊需要
所以找了些資料如何在kernel寫socket programming...
(其實在kernel作這種事情是不道德的...小孩子千萬不要亂用喔...叔叔是有練過的)
大致上是要利用kernel裡面的struct sock直接使用

sock_create(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock);
sock->ops->bind ( sock, (struct sockaddr*) &sin2, sizeof(cmdsin));
sock_release(sock);
上面是幾個比較簡單的setup function
然後要send的話就使用
struct msghdr msg;
struct iovec iov;

iov.iov_base=buf;
iov.iov_len=count;
msg.msg_iov=&iov;
msg.msg_iovlen=1;
msg.msg_control=NULL;
msg.msg_controllen=0;
msg.msg_name = (struct sockaddr*)&sin;
msg.msg_namelen = sizeof(sin);
msg.msg_flags = 0;//MSG_DONTWAIT;

sock_sendmsg(sock,&msg,count);
如果想要送的東西並不是從user level傳下來的...
就必須改成
oldseg= get_fs();
set_fs (KERNEL_DS);

// send process.......

set_fs (oldseg);

至於recieve我還在檢查packet究竟掉在那裡...orz

2 comments:

cypress said...

您好,我在網路上找到你的這篇文章,想請教一些問題有關在kenel發udp封包的問題,不知道方不方便,我的mail是cypress@edimax.com.tw

momodalo said...

你可以email給我 momodalo@gmail.com