我正在尝试用 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 函数填充该变量。这对我来说是一个更好的方法。