2
我使用SSL編寫了我的第一個服務器客戶端程序。我試圖在局域網內的兩臺臺式機之間發送和接收一些數據。但我在我的終端中收到垃圾價值。請幫幫我。如果SSL_write()和SSL_read()在出錯時返回負值,我的情況就是這樣,我明顯不知道原因。在wireshark中,我可以看到TCP用於我們的通信應該是SSL/TSLv1。以下是代碼。SSL連接讀取中的垃圾值
Client.c
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <malloc.h>
#include <string.h>
#include <sys/socket.h>
#include <resolv.h>
#include <netdb.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#define FAIL -1
int OpenConnection(const char *hostname, int port)
{ int sd;
struct hostent *host;
struct sockaddr_in addr;
if ((host = gethostbyname(hostname)) == NULL)
{
perror(hostname);
abort();
}
sd = socket(PF_INET, SOCK_STREAM, 0);
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = *(long*)(host->h_addr);
if (connect(sd, (struct sockaddr*)&addr, sizeof(addr)) != 0)
{
close(sd);
perror(hostname);
abort();
}
else
puts("connection successful\n");
return sd;
}
SSL_CTX* InitCTX(void)
{ SSL_METHOD *method;
SSL_CTX *ctx;
OpenSSL_add_all_algorithms();
SSL_load_error_strings();
method = SSLv3_client_method();
ctx = SSL_CTX_new(method);
if (ctx == NULL)
{
ERR_print_errors_fp(stderr);
abort();
}
return ctx;
}
int main(int count, char *strings[])
{ SSL_CTX *ctx;
int server;
SSL *ssl;
char rcvbuf[1024];
int byteswritten, bytesread;
char *hostname, *portnum;
char msgtobesent[100];
if (count != 3)
{
printf("usage: %s <hostname> <portnum>\n", strings[0]);
exit(0);
}
printf ("Message to be sent to the SSL server: ");
fgets (msgtobesent, 100, stdin);
SSL_library_init();
hostname=strings[1];
portnum=strings[2];
ctx = InitCTX();
server = OpenConnection(hostname, atoi(portnum));
ssl = SSL_new(ctx);
SSL_set_fd(ssl, server);
if (SSL_connect(ssl) == FAIL)
ERR_print_errors_fp(stderr);
else
{
printf("Connected with %s encryption\n", SSL_get_cipher(ssl));
byteswritten = SSL_write(ssl, msgtobesent, strlen(msgtobesent));
printf ("Written %d chars\n",byteswritten);
bytesread = SSL_read(ssl, rcvbuf, sizeof(rcvbuf)-1);
rcvbuf[bytesread] = '\0';
printf ("Received %d chars: %s\n", bytesread, rcvbuf);
}
SSL_free(ssl);
close(server); /* close socket */
SSL_CTX_free(ctx); /* release context */
return 0;
}
Server.c
#include <errno.h>
#include <unistd.h>
#include <malloc.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <resolv.h>
#include "openssl/ssl.h"
#include "openssl/err.h"
#define FAIL -1
int OpenListener(int port)
{
int sd;
struct sockaddr_in addr;
sd = socket(PF_INET, SOCK_STREAM, 0);
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = INADDR_ANY;
if (bind(sd, (struct sockaddr*)&addr, sizeof(addr)) != 0)
{
perror("can't bind port");
abort();
}
else
puts("bind successful\n");
if (listen(sd, 10) != 0)
{
perror("Can't configure listening port");
abort();
}
else
puts("listening successfully\n");
return sd;
}
int isRoot()
{
if (getuid() != 0)
{
return 0;
}
else
{
return 1;
}
}
SSL_CTX* InitServerCTX(void)
{
const SSL_METHOD *method;
SSL_CTX *ctx;
OpenSSL_add_all_algorithms();
SSL_load_error_strings(); /
method = SSLv3_server_method();
ctx = SSL_CTX_new(method);
if (ctx == NULL)
{
ERR_print_errors_fp(stderr);
abort();
}
return ctx;
}
int main(int count, char *strings[])
{
SSL_CTX *ctx;
int server, byteswritten, bytesread;
char *portnum;
char rcvbuf[1024];
SSL *ssl;
char *msgtobesent;
if(!isRoot())
{
printf("This program must be run as root/sudo user!!");
exit(0);
}
if (count != 2)
{
printf("Usage: %s <portnum>\n", strings[0]);
exit(0);
}
SSL_library_init();
portnum = strings[1];
ctx = InitServerCTX();
server = OpenListener(atoi(portnum));
while (1)
{ struct sockaddr_in addr;
socklen_t len = sizeof(addr);
int client = accept(server, (struct sockaddr*)&addr, &len);
printf("Connection: %s:%d\n",inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
ssl = SSL_new(ctx);
SSL_set_fd(ssl, client);
bytesread= SSL_read(ssl, (void *)rcvbuf, sizeof(rcvbuf)-1);
rcvbuf[bytesread]='\0';
printf ("Received %d chars: %s\n", bytesread, (char *)rcvbuf);
byteswritten = SSL_write(ssl, "this is from server", strlen("this is from server"));
printf ("Written %d chars\n",byteswritten);
}
SSL_free(ssl);
close(server);
SSL_CTX_free(ctx);
}
從終端輸出:
你好,有人在這裏? – jeevan 2014-12-05 05:04:20