🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

Q&A

解決済

1回答

3442閲覧

inet_addr関数の引数に変数を使いたい

juria

総合スコア5

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

0グッド

0クリップ

投稿2019/12/10 01:11

編集2019/12/10 03:02

前提・実現したいこと

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/ツールのバージョンなど)

エラーに関係のない関数は記載していません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiracamus

2019/12/10 01:25

ソースコードをcodeブロックで囲ってください。
juria

2019/12/10 01:42

囲いました。失礼しました
cateye

2019/12/10 02:38 編集

エラーが1個とワーニングが46個出ます^^; t1.c:199:13: error: non-void function 'inifile' should return a value [-Wreturn-type] return; 環境:linuxMint 19.2 clang 10 コンパイルオプション:--std=c11 -Wno-padded -Weverything ・・・今気が付いた^^: ' #include <stdio.h>' ←これ#の前に全角空白入っていませんか?
juria

2019/12/10 02:11

iniファイル以外の関数は記載していないのですが、プログラムで使用しているコード全文を載せたほうがいいのでしょうか? 使い方を把握しておらず申し訳ございません。
otn

2019/12/10 02:31

inifile関数はどういう仕様のつもりですか?日本語で質問に追記してください。
juria

2019/12/10 03:00

inifile関数と.iniファイルについて追記しました
otn

2019/12/10 11:32

> inifile関数は引数で指定されたパラメーターを探して、"=" 以降をint型で返す ・グローバル変数を更新している ・returnの部分を見ると、= の右辺をintに変換しているらしきコードが無い のですが?つまり、上記説明とコードが関係なさそうです。
guest

回答1

0

自己解決

ソースコードは記載ので問題がなかったようです。

投稿2019/12/11 04:27

juria

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問