C #define string,ai_socktype不支持Servname

时间:2013-09-24 14:44:26

标签: c string sockets c-preprocessor

我正在尝试用C语言编写套接字程序。当我做

时,我的整个代码工作正常
#define PORT "3333"

但不是

#define PORT getParameter("setting.ini","PORT")

基本上,getParameter只打开setting.ini文件并通读,查找变量及其值然后返回它。我这样做的唯一原因是因为我不想在我的代码中对端口号进行硬编码。我得到了:

  

“ai_socktype不支持Servname”

我不知道导致此错误的原因。 有任何想法吗?

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char *substring(char* str, int start, int length) {
    char *newString = (char *)malloc(length * sizeof(char)+1);
    int i, x = 0;
    int end=start+length-1;
    for(i = start ; i <= end; i++)
        newString[x++] = str[i];
    newString[x] = '\0';
    return newString;
}

char *getParameter(char *fName, char *pName)
{
   FILE *fr;
   char line[80];
   int i;

   fr = fopen (fName, "r");  /* open the file for reading */

   while(fgets(line, 80, fr) != NULL)
   {
   i = strcspn (line,"=");
   if(strcmp(pName,substring(line,0,i))==0){
            char *value = substring(line,i+1,strlen(line)-i);
            fclose(fr);
            return value;
        }
   }
   fclose(fr);
}

int main(void){
    char *PORT = getParameter("setting.ini","PORT");
    const int BACKLOG = atoi(getParameter("setting.ini","BACKLOG"));
    printf("%s\n",PORT);
    printf("%d\n",BACKLOG);
    return 0;
}

2 个答案:

答案 0 :(得分:2)

我怀疑您的问题与换行有关。硬编码时的字符串不包含换行符,但是当您使用fgets()读取它们时,解析它们的方式会保留任何尾随\n。可能会混淆您传递值的任何内容以获得该错误。

除此之外,您的代码中存在大量内存泄漏,因为substring()调用的结果永远不会被释放(并且您甚至没有指向它们的指针,因此可以在某些内容中释放它们例)。

答案 1 :(得分:0)

首先 - 确保您的函数提取的值实际上是您所期望的值,并且不包含任何特殊字符,如行尾或类似字符。

此外,无论这是否会解决您的问题,我建议您更改您的方法 - 不要使用#define,而是将PORT变为一个变量,而您将在程序启动时使用代码中的某个地方使用getParameter函数填充该变量。这对我来说会更好。