前提・実現したいこと
iniファイルからのIPアドレスの読み込み
その後、ソケット接続に読み込んだIPアドレスを使用したい
inifile関数は
引数で指定されたパラメーターを探して、"=" 以降をint型で返す
iniファイルのテキストの中身
# chat.ini IP=192.168.0.00 PORT=9999
発生している問題・エラーメッセージ
引数にそのままchar型のIPアドレスを指定すると
Connention refused
と表示され終了する。
該当のソースコード
C言語
#include <stdio.h> #include <stdlib.h> //exit(); #include <string.h> //strlen(); #include <sys/types.h> //socket(); #include <sys/socket.h> //socket(); #include <netinet/in.h> //bind(); #include <signal.h> //signal //関数宣言 void Server(); void Client(); int inifile(char *pa); void readwrite(int which); void setsignal(int signalname); void sighandler(int signalname); //マクロ #define STR_MAX 256 #define INI_FILE "chat.ini" //inifile() //変数 char param[STR_MAX]; //inifile()で使ってる int server_sockfd; //サーバー側 int client_sockfd; //サーバー側 struct sockaddr_in server_address; //サーバー側アドレス構造体 struct sockaddr_in client_address; //サーバー側アドレス構造体 int server_len; //サーバー側 int client_len; //サーバー側 int sockfd; //クライアント側 int len; //クライアント側 int ch[3]; //クライアント側 struct sockaddr_in address; //クライアント側 int result; //クライアント側 char buff[1024]; //送受信用 pid_t rc; //子プロセスの終了待ち static int sig_cnt = 0; //シグナル pid_t my_pid; //PID pid_t your_pid; //PID pid_t* my_pidp; //PIDのポインタ pid_t* your_pidp; char pid[10]; int ipadd; unsigned short port; char ip[13]; int main(int argc, char *argv[]){ setsignal(SIGINT); //シグナルをセット my_pid = getpid(); //PIDを取得 //PIDのポインタ変数にアドレスを代入 //コマンドライン引数があるか if(argc < 2){ printf("The command is lnvalid.\n"); //なければ終了 exit(1); }else{ //iniファイルからIPを取得 //とりあえずIPだけ char *pa = "IP"; inifile(pa); strcpy(ip, param); //ip =deblank(ip); printf("char ip[11]= %c\n",ip[11]); //ip = (char)ipadd; char *par ="PORT"; port = inifile(par); //printf("setting IP =%s",param); //serverとclientと一致するか調べる if(strcmp(argv[1],"server")==0){ //サーバー Server(); }else if(strcmp(argv[1],"client")==0){ //クライアント Client(); }else{ printf("argv is lnvalid\n"); //どちらでもない exit(1); } } } //サーバー void Server(){ int s; printf("In Server\n"); //ソケット server_sockfd = socket(AF_INET,SOCK_STREAM,0); if(server_sockfd == -1){ printf("sockfd error\n"); exit(1); }else{ printf("sockfd OK\n"); } //bind //アドレス構造体に代入 server_address.sin_family = AF_INET ; server_address.sin_addr.s_addr = INADDR_ANY; /* IPアドレス */ server_address.sin_port = htons(port) ; /* ポート番号 */ //アドレス構造体の長さ server_len =sizeof(server_address); s = bind(server_sockfd, (struct sockaddr *)&server_address,server_len); if(s == -1){ perror("bind error\n"); exit(1); }else{ printf("bind OK\n"); } //listen s = listen(server_sockfd ,5); if(s == -1){ printf("listen error\n"); exit(1); }else{ printf("listen ok\n"); } //accept while(1) { int ch[3] ; printf("server waiting...\n"); client_sockfd = accept(server_sockfd ,(struct sockaddr *)&client_address , &client_len); readwrite(client_sockfd); } close(client_sockfd); } //クライアント void Client(){ printf("In Client\n"); sockfd = socket(AF_INET,SOCK_STREAM,0); if(sockfd == -1){ printf("client socket error\n"); }else{ printf("client socket OK\n"); } address.sin_family = AF_INET ; address.sin_addr.s_addr = inet_addr(ip); address.sin_port = htons(port) ; len = sizeof(address); result = connect(sockfd , (struct sockaddr *)&address , len); printf("result =%d\n",result); if ( result == -1 ) { perror("oops: client3"); exit(1); } readwrite(sockfd); } //iniファイル読み込み int inifile(char *pa){ int i = 0, j = 0; char str[STR_MAX]; FILE *fin; //ファイルオープン if((fin = fopen(INI_FILE,"r")) == NULL){ printf("fin error:[%s]\n",INI_FILE); return -1; } for(;;){ if(fgets(str, STR_MAX, fin) == NULL){ fclose(fin); return -3; }else{ } if(!strncmp(str,pa,strlen(pa))) { while(str[i++] != '='){ ; } while(str[i] != '\n'){ param[j++] = str[i++]; } param[j] = '\0'; printf("param = %s\n",param); //ファイルクローズ fclose(fin); return; }else{ } } //ファイルクローズ fclose(fin); return -1; }
試したこと
int型にキャストしたりしましたがエラーメッセージは変わりませんでした
inet_addr(*ip);
にした場合のみコアダンプとなります。
補足情報(FW/ツールのバージョンなど)
エラーに関係のない関数は記載していません。
回答1件
あなたの回答
tips
プレビュー