【问题标题】:C #define string, Servname not supported for ai_socktypeC#define 字符串,ai_socktype 不支持 Servname
【发布时间】:2013-09-24 14:44:25
【问题描述】:

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

#define PORT "3333"

但不是

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

基本上,getParameter 只是打开setting.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] = '\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;
}

【问题讨论】:

    标签: c string sockets c-preprocessor


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-05-29
        • 1970-01-01
        • 2016-08-21
        • 1970-01-01
        • 1970-01-01
        • 2017-08-27
        • 1970-01-01
        • 2013-04-19
        • 2017-03-07
        相关资源
        最近更新 更多