0

我正在尝试使用 strerror_r 从套接字函数中获取错误,但代码未编译。我得到的错误为invlaid conversion from char * to an int. 我已经在我的代码中包含了errorno.hstring.h,我正在使用在 ubuntu 12.04 上运行的 eclipse ide。代码如下。

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);
   }
4

3 回答 3

2

添加

Include <errno.h>

应该解决问题


请注意,根据文档,此错误的另一个原因可能是,

在符合 XSI 的系统上返回 int并在 GNU 特定系统上返回char* 。

于 2013-10-11T15:18:22.960 回答
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() 。

于 2013-10-11T15:21:53.320 回答
1

根据http://linux.die.net/man/3/strerror_rstrerror_r可以返回 achar *int. 该char *版本说它是 GNU 特定的,所以如果您使用的是 GNU,也许这就是问题所在。

于 2013-10-11T15:17:42.250 回答