2013-10-11 158 views
0

我想使用strerror_r從套接字函數中獲取錯誤,但代碼沒有編譯。我得到的錯誤爲invlaid conversion from char * to an int。我在我的代碼中包含了errorno.hstring.h,我使用的是運行在Ubuntu 12.04上的eclipse ide。代碼如下。編譯錯誤,同時獲取c代碼中的錯誤號

int err; 
char buffer[50]; 
result=connect(socketHandle, (struct sockaddr *)&remoteSocketInfo, sizeof(sockaddr_in)); 

    if(result==0) 
    { 
     printf("\n connect success "); 

    } 
    else if(result==-1) 
    { 
     err = strerror_r(errno,buffer,50);// error in place 
     printf("%d",err); 
    } 
+0

'strerror_r'返回'char *'而不是'int'。 –

+0

「我在我的代碼中包含了'errorno.h'和'string.h'」 - 然後請向我們展示帶有'#include'指令的代碼。顯示(複製粘貼)代碼比描述代碼的外觀總是更好。 (如果你真的包含'errorno.h',你會得到一個錯誤信息;它是'errno.h'。)請複製並粘貼錯誤消息,而不是重新輸入。看似微妙的細微差別可能很重要。 http://sscce.org/ –

回答

2

這是因爲默認情況下的GNU版本strerror_r()的使用,它具有以下特徵:

char *strerror_r(int errnum, char *buf, size_t buflen); 

您可以嘗試取消定義_GNU_SOURCE宏觀爲了得到標準版本程序的。喜歡的東西:

#undef _GNU_SOURCE 
#include <string.h> 

這可能是隔離到它自己的頭文件是一個好主意(xsi_strerror_r.h等),這樣就可以包括只在需要的地方。或者甚至是一個圍繞strerror_r()的包裝函數,以便不定義_GNU_SOURCE將沒有其他意想不到的效果。例如:

#ifndef XSI_STRERROR_R 
#define XSI_STRERROR_R 

#undef _GNU_SOURCE 
#include <string.h> 

int xsi_strerror_r(int errnum, char *buf, size_t buflen); 

#endif 

上面是一個頭文件(xsi_strerror_r.h)。然後,您可以在其自己的源文件提供xsi_strerror_r一個簡單的實現():

#include "xsi_strerror_r.h" 
int xsi_strerror_r(int errnum, char *buf, size_t buflen) 
{ 
    return strerror_r(errnum, buf, buflen); 
} 

然後你只使用xsi_strerror_r()在你的代碼的其餘部分。

+0

有沒有辦法讓錯誤號碼爲整數? –

+0

'#ifdef'是不必要的。如果宏沒有被定義,'#undef'什麼都不做。 –

+1

@SanthoshPai:當然,這就是'errno'。 –

1

http://linux.die.net/man/3/strerror_rstrerror_r可以返回一個char *intchar *版本說它是GNU特有的,所以如果你使用GNU,也許這就是問題所在。

+0

我看到了一個函數原型返回int的地方。現在如何獲得錯誤號碼? –

+0

@SanthoshPai,我不確定你在問什麼 - 錯誤號被作爲參數傳遞給strerror_r。 –

+0

@SanthoshPai爲什麼不只是'printf(「錯誤:%d \ n」,errno);'那麼? – technosaurus

2

添加

Include <errno.h> 

應該解決的問題


注意,其他原因錯誤According to docs可能是,

返回上兼容XSI系統INT並在GNU特定系統上返回char *。

+0

我已經這樣做 –