C #define 字符串,ai_socktype不支持服务名称



我正在尝试用 C 语言编写套接字程序。当我这样做时,我的整个代码工作正常

#define PORT "3333"

但不是

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

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

"ai_socktype不支持服务名称"

我不知道是什么原因导致此错误。有什么想法吗?

#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] = '';
    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("%sn",PORT);
    printf("%dn",BACKLOG);
    return 0;
}

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

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

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

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

相关内容

最新更新