sockets.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
- /*
- kHTTPd -- the next generation
- Basic socket functions
- */
- /****************************************************************
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- ****************************************************************/
- #include "prototypes.h"
- #include <linux/kernel.h>
- #include <linux/net.h>
- #include <linux/version.h>
- #include <linux/smp_lock.h>
- #include <net/sock.h>
- /*
- MainSocket is shared by all threads, therefore it has to be
- a global variable.
- */
- struct socket *MainSocket=NULL;
- int StartListening(const int Port)
- {
- struct socket *sock;
- struct sockaddr_in sin;
- int error;
-
- EnterFunction("StartListening");
-
- /* First create a socket */
-
- error = sock_create(PF_INET,SOCK_STREAM,IPPROTO_TCP,&sock);
- if (error<0)
- (void)printk(KERN_ERR "Error during creation of socket; terminatingn");
- /* Now bind the socket */
-
- sin.sin_family = AF_INET;
- sin.sin_addr.s_addr = INADDR_ANY;
- sin.sin_port = htons((unsigned short)Port);
-
- error = sock->ops->bind(sock,(struct sockaddr*)&sin,sizeof(sin));
- if (error<0)
- {
- (void)printk(KERN_ERR "kHTTPd: Error binding socket. This means that some other n");
- (void)printk(KERN_ERR " daemon is (or was a short time ago) using port %i.n",Port);
- return 0;
- }
- /* Grrr... setsockopt() does this. */
- sock->sk->reuse = 1;
- /* Now, start listening on the socket */
-
- /* I have no idea what a sane backlog-value is. 48 works so far. */
-
- error=sock->ops->listen(sock,48);
- if (error!=0)
- (void)printk(KERN_ERR "kHTTPd: Error listening on socket n");
-
- MainSocket = sock;
-
- EnterFunction("StartListening");
- return 1;
- }
- void StopListening(void)
- {
- struct socket *sock;
-
- EnterFunction("StopListening");
- if (MainSocket==NULL) return;
-
- sock=MainSocket;
- MainSocket = NULL;
- sock_release(sock);
- LeaveFunction("StopListening");
- }