0

我正在尝试用 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;
}
4

2 回答 2

2

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

除此之外,您的代码中有许多内存泄漏,因为您的substring()调用结果从未被释放(而且您甚至没有保留指向它们的指针,因此在某些情况下它们可以被释放)。

于 2013-09-24T14:58:44.127 回答
0

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

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

于 2013-09-24T15:25:51.563 回答