⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sslvpn_main.c

📁 ssl vpn系统.web服务器不支持ssl的情况下,browser可以使用ssl建立连接.
💻 C
字号:
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <linux/types.h>
#include "list.h"
#include "sys_ssl.h"
fd_set ssl_read_set;
fd_set result_set;
struct list_head  sslsocks;
#define dprintf printf
#define  SSL_SERV_PORT 443
int verify_client=0;
int ssl_listen_fd=-1;
int Debug=0;
int nfds=0;
void del_fd_set(int fd)
{
	  
//	   if(nfds>=fd) nfds=fd-1;
	   FD_CLR(fd,&ssl_read_set);

}
void memory_init()
{
	INIT_LIST_HEAD(&sslsocks);
	FD_ZERO(&ssl_read_set);
}

inline void add_fd_set(int fd)
{
	   if(nfds<fd) nfds=fd+1;
	   FD_SET(fd,&ssl_read_set);
	   
}

inline struct ssl_client * get_ssl_client_by_fd(int fd)
{
	return NULL;
}


void remove_client(struct ssl_client * client)
{

	dprintf("Remove client %d  %d \n",client->fd,client->reverse_fd);
	list_del(&(client->list));
	if(client->fd>0)
	{
		close(client->fd);
		del_fd_set(client->fd);
		client->fd=-1;
	}
	if(client->reverse_fd>0)
	{
		close(client->reverse_fd);
		del_fd_set(client->reverse_fd);
		client->reverse_fd=-1;
	}
	free(client);
	
}

void ssl_server_init(int port)
 {
 	
	struct sockaddr_in sa_serv;
	ssl_listen_fd= socket (AF_INET, SOCK_STREAM, 0);  
  
  	memset (&sa_serv, '\0', sizeof(sa_serv));
  	sa_serv.sin_family      = AF_INET;
  	sa_serv.sin_addr.s_addr = INADDR_ANY;
 	sa_serv.sin_port        = htons (port);          /* Server Port number */
  	if( bind(ssl_listen_fd, (struct sockaddr*) &sa_serv,sizeof (sa_serv))==-1){
  	dprintf("Bind ssl socket error \n");
	exit(1);
  	}

	     
  	if(listen (ssl_listen_fd, 5)==-1){
	dprintf("Ssl socket  failed to listen \n");
	exit(1);
  	}
	dprintf("Ssl socket  ready to listen .\n");
	add_fd_set(ssl_listen_fd);
  	
}



int
main (int argc, char **argv, char **env){  int opt ;
  static char optstr[]="dv";
  while ((opt = getopt (argc, argv, optstr))!=-1)     {           switch (opt) 	{	case 0:	  break;	case 'd':	  Debug = 1;	  break;	 case 'v':	  verify_client = 1;	  break;	  	default:	  	  break;	}	      }
  if(!Debug)
 	if (fork ())
	      exit(0);
 memory_init();
 ssl_init();
 ssl_server_init( SSL_SERV_PORT );
 while(1) 
 {
	char * c=(char *)(&ssl_read_set);
	int i=0;
	for(i=0;i<32;i++)
		dprintf("%u ", *(c+i));
 	dprintf("\nReturn ..................................................................................\n");
	
 	result_set=ssl_read_set;
 	select(nfds,&result_set,0,0,0);
	dprintf("\nSelect ......\n");
	if(ssl_listen_fd>0&&FD_ISSET(ssl_listen_fd,&result_set))
		ssl_serv_accept();
	conn_sock_deal();
	;
 }

 

//ssl_serv_accept();
// sendto_sslclient();
//ssl_serv_read();
// for(;;);
  }




int conn_sock_deal()
{
	struct list_head *p,*n;
	struct ssl_client * client;
	
	for (p = sslsocks.next, n = p->next; p != &sslsocks && p->next; p = n, n = p->next)
	{
		  client=list_entry(p, struct ssl_client, list);
		 // printf(" sslsocks client fd %d \n",client->fd);
		  if(client->fd>0&&FD_ISSET(client->fd,&result_set))
		  {
			//printf(" select client fd %d \n",client->fd);
			ssl_serv_read(client);
		  }
		  if(client->reverse_fd>0&&FD_ISSET(client->reverse_fd,&result_set))
		  	reverse_serv_read(client);
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -