在代码段最后的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(stdout, "AOP Sessions的http报文长度为:%d\n", requestLenght);
strncpy(requestBuffer, request, requestLenght);
#else
int requestLenght=0;
requestLenght=strlen(REQUEST);
strncpy(requestBuffer, REQUEST, requestLenght);
fprintf(stdout, "GET的http报文长度为:%d\n", requestLenght);
#endif
fprintf(stdout, "request的内容为\n:%s\n", 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(stdout, "i:%d\n", 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);
}