📄 sslvpn_main.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 + -