问题描述
- 关于写一个https客户端在指定位置读取文件内容
- 在代码段最后的while循环中,用SSL_read函数读取文件远程的内容,但是内容读取后,总有小部分内容的缺失,while程序执行完后,并没有执行while之后的内容,
程序运行到这里就不运行了int main(int argc char *argv[]){ int sock_fd ret; struct sockaddr_in server_addr; char requestBuffer[2048]={0}; char responseBuffer[2048]={0}; SSL *ssl; SSL_CTX *ctx; FILE *fp; /*创建套接字*/ if((sock_fd=socket(AF_INET SOCK_STREAM 0))==-1) /*填充服务器资料*/ bzero(&server_addr sizeof(server_addr)); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(PORT); if(inet_pton(AF_INET IP &server_addr.sin_addr)<=0) { fprintf(stderr创建网络连接失败!n""); exit(1); } else { fprintf(stdout创建网络连接成功!n""); } /*连接服务器*/ if((connect(sock_fd (struct sockaddr*)&server_addr sizeof(struct sockaddr)))==-1) { fprintf(stderr连接服务器失败!n""); } else { fprintf(stdout连接服务器成功!n""); } /* SSL初始化 */ SSL_library_init(); SSL_load_error_strings(); ctx = SSL_CTX_new(SSLv23_client_method()); if (ctx == NULL) { ERR_print_errors_fp(stderr); exit(1); } ssl = SSL_new(ctx); if (ssl == NULL) { ERR_print_errors_fp(stderr); exit(1); } /* 把socket和SSL关联 * */ ret = SSL_set_fd(ssl sock_fd); if (ret == 0) { ERR_print_errors_fp(stderr); exit(1); } RAND_poll(); while (RAND_status() == 0) { unsigned short rand_ret = rand() % 65536; RAND_seed(&rand_ret sizeof(rand_ret)); } ret = SSL_connect(ssl); if (ret != 1) { ERR_print_errors_fp(stderr); exit(1); } /*发送request*/#ifdef AOP_SESSIONS_TEST char request[2048]; int requestLenght=0; memset(request 0 2048); getSessionsRequest(request); requestLenght=strlen(request); fprintf(stdoutAOP Sessions的http报文长度为:%dn"" requestLenght); strncpy(requestBuffer request requestLenght);#else int requestLenght=0; requestLenght=strlen(REQUEST); strncpy(requestBuffer REQUEST requestLenght); fprintf(stdoutGET的http报文长度为:%dn"" requestLenght);#endif fprintf(stdoutrequest的内容为n:%sn"" requestBuffer); if((SSL_write(ssl requestBuffer requestLenght))<0) { fprintf(stdout发送request失败!n""); } else { fprintf(stdout发送request成功!n""); } /*接受response*/ int nbytes=0; fp=fopen(""fw.bin""w+""); if(!fp) { fprintf(stdout文件未成功打开!n""); exit(0); } else { fprintf(stdout文件打开成功!n""); } int i=0; while((nbytes=SSL_read(ssl responseBuffer 1))==1) { if(i<4) { if(responseBuffer[0]=='r' || responseBuffer[0]=='n') { i++; } else { i=0; } printf(responseBuffer); } else { fwrite(responseBuffer 1 1 fp); i++; fprintf(stdouti:%dn"" i); if(i%256==0) { fflush(fp); } } } fclose(fp); ret = SSL_shutdown(ssl); if (ret != 1) { ERR_print_errors_fp(stderr); exit(1); } close(sock_fd); SSL_free(ssl); SSL_CTX_free(ctx); ERR_free_strings(); exit(0);}
解决方案
先用别的工具直接下载服务器端的文件,看能否下载完整的
其次就是你的客户端循环读取数据,是否长度处理正确。
解决方案二:
其他工具下载是完整的,初步认定是最后一次缓冲区存盘没有执行,导致文件的缺失。
目前程序运行的状况是:程序在SSL_read 这个while里面没有出来,即使文件读完了,也没有出来执行后面的fclose函数
我猜想是不是ssl_read阻塞的问题。是否是这个函数一直要接受数据,但数据没有到来,它也不知到数据是否传完了,所以阻塞在这里
解决方案三:
其他工具下载是完整的,初步认定是最后一次缓冲区存盘没有执行,导致文件的缺失。
目前程序运行的状况是:程序在SSL_read 这个while里面没有出来,即使文件读完了,也没有出来执行后面的fclose函数
我猜想是不是ssl_read阻塞的问题。是否是这个函数一直要接受数据,但数据没有到来,它也不知到数据是否传完了,所以阻塞在这里
解决方案四:
其他工具下载是完整的,初步认定是最后一次缓冲区存盘没有执行,导致文件的缺失。
目前程序运行的状况是:程序在SSL_read 这个while里面没有出来,即使文件读完了,也没有出来执行后面的fclose函数
我猜想是不是ssl_read阻塞的问题。是否是这个函数一直要接受数据,但数据没有到来,它也不知到数据是否传完了,所以阻塞在这里
时间: 2024-12-16 22:22:14