Hi,
I am trying to figure out how to write socket program in kernel mode.
From the kernel source of 2.4.20-8, I figured the following steps, but it
seems it does not work(the receiver is a user-space program, just listen and
recv udp packages. what happened is the receiver got nothing, while no error
msg at sender). I have tried to play with the same sender program in user
space, which works. So the problem seems to be incorrect use of socket
creation and msg send call. Could sb point a link for a working examples, or
nicely point out my mistake?
Thanks a lot!
Shuang,
struct socket * sock;
struct sockaddr_in serv_addr;
struct msghdr msg_header;
struct iovec msg_iov;
unsigned char send_buf[SIZE];
res.bytes[0] = 192;
res.bytes[1] = 168;
res.bytes[2] = 102;
res.bytes[3] = 1;
memset (send_buf, 255, SIZE);
memset (&serv_addr, 0, sizeof (serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = res.word|htonl(0);
serv_addr.sin_port = htons (PORT);
printk ("<1>Hello, world\n");
printk ("The process is %s (pid %i)\n", (char *) current->comm,
current->pid);
printk ("s_addr = %u", serv_addr.sin_addr.s_addr);
if (sock_create(AF_INET, SOCK_DGRAM, 0,&sock)<0)
{
printk(" Error Creating socket\n");
return -1;
}
if (sock_map_fd(sock) < 0)
{
printk(" Error mapping socket\n");
return -1;
}
sock->sk->allocation = GFP_NOIO;
msg_iov.iov_base = send_buf;
msg_iov.iov_len = 8;
msg_header.msg_name = (struct sockaddr*) &serv_addr;
msg_header.msg_namelen = sizeof (serv_addr);
msg_header.msg_iov = &msg_iov;
msg_header.msg_iovlen = 1;
msg_header.msg_control = NULL;
msg_header.msg_controllen = 0;
if (sock_sendmsg(sock, &msg_header, 8) < 0){
printk("Request send Error, \n");
}
printk(" Message sent\n");
return 0;
|