Re: sock_recvmsg() doesnt work

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



What's the size of recv_buf? The MSG_WAITALL flag means that
sock_recvmsg will sleep until the buffer is full.

Regards,
Jaime.

On Thu, Jan 15, 2004 at 03:31:53PM +0100, TI8 Benjamin Kohler wrote:
> hi,
> 
> actually i'm using a socket of type SOCK_STREAM. i also set the
> MSG_WAITALL flag within the sock_recvmsg but this causes that socket hangs
> up. the return code in this case is -512.
> i cant find any data about it...
> any hints?????
> 
> regards
> benny
> 
> Rithin Kumar Shetty sagte:
> > What type of socket are you using ? I mean there are several types of
> > them :
> > SOCK_STREAM, SOCK_DGRAM, SOCK_RAW etc. Which one did you use ?
> > Based on the type of the socket functions like tcp_recvmsg, udp_recvmsg
> > etc are called
> > from sock_recvmsg when it calls  sock->ops->recvmsg(). So you may want
> > to look at those
> > functions to know what is happening.
> >
> > Hope this Helps,
> > Rithin.
> >
> >
> > TI8 Benjamin Kohler wrote:
> >
> >>hi,
> >>
> >>i just wrote a kernel module which sends some data to a server. after
> >> the server has received the data it sends back some data to the kernel
> >> module. sending data from the module to the server works! but i cant
> >> get the response sent by the server.
> >>for receiving data within my kernel module i use the sock_recvmsg
> >> function. the return value is always 0. does anybody know how i have
> >> exactly to use this function so that i can receive any data within my
> >> kernel module
> >>
> >>here is my Send_Msg function within my Kernel Module:
> >>
> >>
> >>int Send_Msg(const char *buffer)
> >>{
> >> struct msghdr   send_msg;
> >> struct msghdr   recv_msg;
> >> struct iovec  iov;
> >> struct timeval now1;
> >> mm_segment_t oldfs;
> >> int error,i,len,lat;
> >> char recv_buf[1024];
> >> int j = 0;
> >>
> >>
> >> iov.iov_base=(void *)buffer;
> >> iov.iov_len=strlen(buffer);
> >> printk("<1>Size of Buffer in Send_Msg: %d\n", sizeof(buffer));
> >>
> >> send_msg.msg_name=NULL;
> >> send_msg.msg_namelen=0; //sizeof(server);
> >> send_msg.msg_iov=&iov;
> >> send_msg.msg_iovlen=1;
> >> send_msg.msg_control=NULL;
> >> send_msg.msg_controllen=0;
> >> send_msg.msg_flags = 0;
> >>
> >> do_gettimeofday(&now1);
> >>
> >> oldfs = get_fs(); set_fs(KERNEL_DS);
> >> error = sock_sendmsg(Socket[0], &send_msg, (size_t)buffer);
> >> set_fs(oldfs);
> >>
> >> iov.iov_base=(void *)recv_buf;
> >> iov.iov_len=sizeof(recv_buf);
> >>
> >> recv_msg.msg_name=NULL;
> >> recv_msg.msg_namelen=0; //sizeof(server);
> >> recv_msg.msg_iov=&iov;
> >> recv_msg.msg_iovlen=1;
> >> recv_msg.msg_control=NULL;
> >> recv_msg.msg_controllen=0;
> >> recv_msg.msg_flags = 0;
> >>
> >> udelay(1000);
> >>
> >>
> >> oldfs = get_fs(); set_fs(KERNEL_DS);
> >> len = sock_recvmsg(Socket[0], &recv_msg, (size_t)recv_buf,
> >> MSG_WAITALL); set_fs(oldfs);
> >>
> >> if (len<0)
> >>  printk(KERN_ALERT "ERRO receive ########\n");
> >>
> >> if (error<0)
> >>   printk(KERN_ALERT "Erro send msg ERRO = %d
> >> buffer=%s\n",error,buffer);
> >>
> >> printk("<1>recieved bytes: %d\n", len);
> >>
> >>
> >>         sock_release(Socket[0]);
> >>         return 0;
> >>}
> >>
> >>
> >>the sock_sendmsg works fine, but the sock_recvmsg() always seems to
> >> fail!!! Any help out there???
> >>
> >>
> >>greetings
> >>benny
> >>
> >>
> 
> 
> -- 
> 
> 
> 
> --
> Kernelnewbies: Help each other learn about the Linux kernel.
> Archive:       http://mail.nl.linux.org/kernelnewbies/
> FAQ:           http://kernelnewbies.org/faq/

--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive:       http://mail.nl.linux.org/kernelnewbies/
FAQ:           http://kernelnewbies.org/faq/


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux