2012-06-20 53 views
0

我在C語言中遇到了套接字編程的問題。我有一個應用程序使用C連接函數打開一個套接字,我不想通過套接字進行任何加密。此應用程序還使用openssl庫的函數(用於其他目的),所以我必須在編譯時與lssl鏈接。由於這種鏈接到lssl,應用程序失敗。我不知道發生了什麼事情,是openssl聯繫重寫C的連接或什麼?這是一個正確的方法來使用C的套接字函數以及使用SSL庫嗎?C與ssl連接的應用程序故障

+1

不,OpenSSL不會覆蓋任何C函數。將OpenSSL與未加密的連接相結合沒有問題。問題是別的。 –

+1

失敗如何?出了什麼問題? –

+1

某些錯誤代碼或源代碼可能會幫助我們識別問題。 –

回答

0

打開socket直到連接的代碼如下。

int memfsnode_init() 
{ 
    int sockfd, portno, n,len,i,x,y; 
    long l; 
    struct sockaddr_in serv_addr; 

    portno = METADATASERVER_PORT; //port = 5000 
    char *serverip; 
    serverip=(char*)malloc(20*sizeof(char)); 
    strncpy(serverip,"127.0.0.1",strlen("127.0.0.1")); 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) 
     error("ERROR opening socket"); 
    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = inet_addr(serverip); 
    serv_addr.sin_port = htons(portno); 
    if (connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) < 0) 
     error("ERROR connecting"); 
    return(sockfd); 
} 
0
strncpy(serverip,"127.0.0.1",strlen("127.0.0.1")); 

這是壞了。 strncpy的最後一個參數應該是緩衝區的大小,而不是要複製的字符串的長度。如果它不是更大的比字符串的長度(它不在這種情況下)會發生不好的事情。作爲strncpy的文件說:

警告:如果SRC的前n個字節之間沒有空字節,放入dest字符串不會是空值終止。

+0

謝謝,這解決了這個問題,但對我來說,爲什麼connect()在不與ssl鏈接的情況下工作?即使我正在使用相同的strncpy語句...對此有任何想法? – alice

+0

很難理解違反規則的確切後果。這通常是不值得的 - 接受的教訓就是你必須遵守規則。但是如果我不得不猜測,我會說如果沒有OpenSSL,你會得到操作系統爲零填充的「新鮮」內存,其中一個零將終止你的字符串。使用OpenSSL,您可以獲得以前由OpenSSL使用的內存,並且它沒有在正確的位置出現零。 –

+0

yaa也許這可能是原因..謝謝。 – alice