openssl 中函数 SSL_accept()的返回值?

2018-12-19 09:42:19 +08:00
 Erichailong

各位前辈,本科三年级的一次有关 VPN 的 lab,下面是主函数


int main(int argc, char * argv[]) {
	SSL_METHOD *meth;
	SSL_CTX* ctx;
	SSL *ssl;
	int err;
    
	// Step 0: OpenSSL library initialization 
	// This step is no longer needed as of version 1.1.0.
	SSL_library_init();
	SSL_load_error_strings();
	SSLeay_add_ssl_algorithms();
    
	// Step 1: SSL context initialization
	meth = (SSL_METHOD *)TLSv1_2_method();
	ctx = SSL_CTX_new(meth);
	SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
	// Step 2: Set up the server certificate and private key
	SSL_CTX_use_certificate_file(ctx, "./cert_server/server.crt", SSL_FILETYPE_PEM);
	SSL_CTX_use_PrivateKey_file(ctx, "./cert_server/server.key", SSL_FILETYPE_PEM);
	// Step 3: Create a new SSL structure for a connection
	ssl = SSL_new(ctx);
	int tunfd, sockfd;
	tunfd = createTunDevice();
	int listen_sock = initTCPServer();
	struct sockaddr_in sa_client;
	size_t client_len;
	
	
	pthread_t t;
	if(pthread_create(&t, NULL, get_tunfd, (void *)(&tunfd))==-1){
		printf("pthread create dispath");
	}
	
	
	while (1) {
		sockfd = accept(listen_sock, (struct sockaddr*)&sa_client, &client_len);
		free_malloc();
		*****************************************************
		struct tun_route* temp=tun_route;   //当注释掉这个语句后,
		******************************************************
		if (fork() == 0) { // The child process
			close(listen_sock);

			SSL_set_fd(ssl, sockfd);
            ********************************************************
			err = SSL_accept(ssl);        //返回正确连接,否则返回错误指令值-1
            ********************************************************
			CHK_SSL(err);
			printf("SSL connection established!\n");

			// -----login-----
			int login = Authentication(ssl);

			// Enter the main loop
			while (login & 1) {
				fd_set readFDSet;
				FD_ZERO(&readFDSet);
				FD_SET(SSL_get_fd(ssl), &readFDSet);
				FD_SET(tunfd, &readFDSet);
				select(FD_SETSIZE, &readFDSet, NULL, NULL, NULL);

				if (FD_ISSET(SSL_get_fd(ssl), &readFDSet)) socketSelected(tunfd, ssl);
				if (FD_ISSET(tunfd, &readFDSet)) tunSelected(tunfd, ssl);
			}

			SSL_shutdown(ssl);
			SSL_free(ssl);
			close(sockfd);
			return 0;
		}
		else {
			close(sockfd);
		}
	}
	return 0;
}

当我注释掉上面struct tun_route* temp=tun_route; 后,子进程中的 SSL_accept()返回正确值,当我加上这句后,SSL_accept 便返回一个错误指令-1。我不知道这是什么原因。其中 tun_route 的定义与其他的没有联系:

struct tun_route{
	pid_t pid;
	int client_ip;
	int fd[2];
	struct tun_route* next;
};
2733 次点击
所在节点    问与答
1 条回复
Erichailong
2018-12-20 10:49:02 +08:00
ok,重启电脑后,就不报错,但不知道什么原理

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/518841

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX