0

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;
}
4

2 に答える 2

2

あなたの問題は改行に関連していると思われます。ハードコードするときの文字列には改行が含まれていませんが、を使用してそれらを読み取ると、それらをfgets()解析する方法で末尾の が保持されます\n。そのエラーを取得するために値を渡すものを混乱させる可能性があります。

それとは別に、substring()呼び出しの結果が決して解放されないため、コードに多くのメモリ リークがあります (場合によっては解放される可能性があるため、それらへのポインターも保持しません)。

于 2013-09-24T14:58:44.127 に答える
0

まず、関数によってフェッチされる値が実際に期待どおりであり、行末などの特殊文字が含まれていないことを確認してください。

また、これで問題が解決するかどうかに関係なく、アプローチを変更することをお勧めします。#define を使用するのではなく、PORT を変数にして、プログラムの起動時にコードのどこかで getParameter 関数を使用して入力します。それは私にとってより良いアプローチのように感じます。

于 2013-09-24T15:25:51.563 に答える