質問編集履歴

5

誤字修正

2019/12/10 03:02

投稿

juria
juria

スコア5

test CHANGED
File without changes
test CHANGED
@@ -20,9 +20,9 @@
20
20
 
21
21
  # chat.ini
22
22
 
23
- IP=192.168.1.72
23
+ IP=192.168.0.00
24
-
24
+
25
- PORT=9734
25
+ PORT=9999
26
26
 
27
27
  ```
28
28
 

4

inifile関数についての追記

2019/12/10 03:02

投稿

juria
juria

スコア5

test CHANGED
File without changes
test CHANGED
@@ -6,6 +6,30 @@
6
6
 
7
7
  その後、ソケット接続に読み込んだIPアドレスを使用したい
8
8
 
9
+
10
+
11
+ inifile関数は
12
+
13
+ 引数で指定されたパラメーターを探して、"=" 以降をint型で返す
14
+
15
+
16
+
17
+ iniファイルのテキストの中身
18
+
19
+ ```
20
+
21
+ # chat.ini
22
+
23
+ IP=192.168.1.72
24
+
25
+ PORT=9734
26
+
27
+ ```
28
+
29
+
30
+
31
+
32
+
9
33
  ### 発生している問題・エラーメッセージ
10
34
 
11
35
 

3

コードブロック

2019/12/10 02:59

投稿

juria
juria

スコア5

test CHANGED
File without changes
test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  C言語
26
26
 
27
-
27
+ ```
28
28
 
29
29
   #include <stdio.h>
30
30
 
@@ -440,7 +440,7 @@
440
440
 
441
441
  }
442
442
 
443
-
443
+ ```
444
444
 
445
445
  ### 試したこと
446
446
 

2

誤字

2019/12/10 01:42

投稿

juria
juria

スコア5

test CHANGED
File without changes
test CHANGED
@@ -26,19 +26,19 @@
26
26
 
27
27
 
28
28
 
29
- #include <stdio.h>
29
+  #include <stdio.h>
30
-
30
+
31
- #include <stdlib.h> //exit();
31
+  #include <stdlib.h> //exit();
32
-
32
+
33
- #include <string.h> //strlen();
33
+  #include <string.h> //strlen();
34
-
34
+
35
- #include <sys/types.h> //socket();
35
+  #include <sys/types.h> //socket();
36
-
36
+
37
- #include <sys/socket.h> //socket();
37
+  #include <sys/socket.h> //socket();
38
-
38
+
39
- #include <netinet/in.h> //bind();
39
+  #include <netinet/in.h> //bind();
40
-
40
+
41
- #include <signal.h> //signal
41
+  #include <signal.h> //signal
42
42
 
43
43
 
44
44
 

1

追記

2019/12/10 01:16

投稿

juria
juria

スコア5

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,459 @@
1
+ ### 前提・実現したいこと
2
+
3
+
4
+
1
5
  iniファイルからのIPアドレスの読み込み
2
6
 
3
7
  その後、ソケット接続に読み込んだIPアドレスを使用したい
8
+
9
+ ### 発生している問題・エラーメッセージ
10
+
11
+
12
+
13
+ 引数にそのままchar型のIPアドレスを指定すると
14
+
15
+ Connention refused
16
+
17
+ と表示され終了する。
18
+
19
+
20
+
21
+
22
+
23
+ ### 該当のソースコード
24
+
25
+ C言語
26
+
27
+
28
+
29
+ #include <stdio.h>
30
+
31
+ #include <stdlib.h> //exit();
32
+
33
+ #include <string.h> //strlen();
34
+
35
+ #include <sys/types.h> //socket();
36
+
37
+ #include <sys/socket.h> //socket();
38
+
39
+ #include <netinet/in.h> //bind();
40
+
41
+ #include <signal.h> //signal
42
+
43
+
44
+
45
+
46
+
47
+ //関数宣言
48
+
49
+ void Server();
50
+
51
+ void Client();
52
+
53
+ int inifile(char *pa);
54
+
55
+ void readwrite(int which);
56
+
57
+
58
+
59
+ void setsignal(int signalname);
60
+
61
+ void sighandler(int signalname);
62
+
63
+
64
+
65
+ //マクロ
66
+
67
+ #define STR_MAX 256
68
+
69
+ #define INI_FILE "chat.ini" //inifile()
70
+
71
+
72
+
73
+ //変数
74
+
75
+
76
+
77
+ char param[STR_MAX]; //inifile()で使ってる
78
+
79
+
80
+
81
+ int server_sockfd; //サーバー側
82
+
83
+ int client_sockfd; //サーバー側
84
+
85
+
86
+
87
+ struct sockaddr_in server_address; //サーバー側アドレス構造体
88
+
89
+ struct sockaddr_in client_address; //サーバー側アドレス構造体
90
+
91
+
92
+
93
+ int server_len; //サーバー側
94
+
95
+ int client_len; //サーバー側
96
+
97
+
98
+
99
+ int sockfd; //クライアント側
100
+
101
+ int len; //クライアント側
102
+
103
+ int ch[3]; //クライアント側
104
+
105
+ struct sockaddr_in address; //クライアント側
106
+
107
+ int result; //クライアント側
108
+
109
+
110
+
111
+ char buff[1024]; //送受信用
112
+
113
+
114
+
115
+ pid_t rc; //子プロセスの終了待ち
116
+
117
+
118
+
119
+ static int sig_cnt = 0; //シグナル
120
+
121
+
122
+
123
+ pid_t my_pid; //PID
124
+
125
+ pid_t your_pid; //PID
126
+
127
+ pid_t* my_pidp; //PIDのポインタ
128
+
129
+ pid_t* your_pidp;
130
+
131
+ char pid[10];
132
+
133
+
134
+
135
+ int ipadd;
136
+
137
+ unsigned short port;
138
+
139
+ char ip[13];
140
+
141
+
142
+
143
+ int main(int argc, char *argv[]){
144
+
145
+ setsignal(SIGINT); //シグナルをセット
146
+
147
+ my_pid = getpid(); //PIDを取得
148
+
149
+ //PIDのポインタ変数にアドレスを代入
150
+
151
+
152
+
153
+ //コマンドライン引数があるか
154
+
155
+ if(argc < 2){
156
+
157
+ printf("The command is lnvalid.\n");
158
+
159
+ //なければ終了
160
+
161
+ exit(1);
162
+
163
+ }else{
164
+
165
+ //iniファイルからIPを取得
166
+
167
+ //とりあえずIPだけ
168
+
169
+ char *pa = "IP";
170
+
171
+ inifile(pa);
172
+
173
+ strcpy(ip, param);
174
+
175
+ //ip =deblank(ip);
176
+
177
+ printf("char ip[11]= %c\n",ip[11]);
178
+
179
+ //ip = (char)ipadd;
180
+
181
+ char *par ="PORT";
182
+
183
+ port = inifile(par);
184
+
185
+ //printf("setting IP =%s",param);
186
+
187
+ //serverとclientと一致するか調べる
188
+
189
+ if(strcmp(argv[1],"server")==0){ //サーバー
190
+
191
+ Server();
192
+
193
+ }else if(strcmp(argv[1],"client")==0){ //クライアント
194
+
195
+ Client();
196
+
197
+ }else{
198
+
199
+ printf("argv is lnvalid\n"); //どちらでもない
200
+
201
+ exit(1);
202
+
203
+ }
204
+
205
+ }
206
+
207
+
208
+
209
+
210
+
211
+
212
+
213
+ }
214
+
215
+
216
+
217
+ //サーバー
218
+
219
+ void Server(){
220
+
221
+ int s;
222
+
223
+ printf("In Server\n");
224
+
225
+ //ソケット
226
+
227
+ server_sockfd = socket(AF_INET,SOCK_STREAM,0);
228
+
229
+ if(server_sockfd == -1){
230
+
231
+ printf("sockfd error\n");
232
+
233
+ exit(1);
234
+
235
+ }else{
236
+
237
+ printf("sockfd OK\n");
238
+
239
+ }
240
+
241
+ //bind
242
+
243
+ //アドレス構造体に代入
244
+
245
+ server_address.sin_family = AF_INET ;
246
+
247
+ server_address.sin_addr.s_addr = INADDR_ANY; /* IPアドレス */
248
+
249
+ server_address.sin_port = htons(port) ; /* ポート番号 */
250
+
251
+
252
+
253
+ //アドレス構造体の長さ
254
+
255
+ server_len =sizeof(server_address);
256
+
257
+
258
+
259
+ s = bind(server_sockfd, (struct sockaddr *)&server_address,server_len);
260
+
261
+
262
+
263
+ if(s == -1){
264
+
265
+ perror("bind error\n");
266
+
267
+ exit(1);
268
+
269
+ }else{
270
+
271
+ printf("bind OK\n");
272
+
273
+ }
274
+
275
+
276
+
277
+ //listen
278
+
279
+ s = listen(server_sockfd ,5);
280
+
281
+
282
+
283
+ if(s == -1){
284
+
285
+ printf("listen error\n");
286
+
287
+ exit(1);
288
+
289
+ }else{
290
+
291
+ printf("listen ok\n");
292
+
293
+ }
294
+
295
+
296
+
297
+ //accept
298
+
299
+ while(1) {
300
+
301
+ int ch[3] ;
302
+
303
+ printf("server waiting...\n");
304
+
305
+ client_sockfd = accept(server_sockfd ,(struct sockaddr *)&client_address , &client_len);
306
+
307
+ readwrite(client_sockfd);
308
+
309
+ }
310
+
311
+ close(client_sockfd);
312
+
313
+ }
314
+
315
+
316
+
317
+ //クライアント
318
+
319
+ void Client(){
320
+
321
+ printf("In Client\n");
322
+
323
+ sockfd = socket(AF_INET,SOCK_STREAM,0);
324
+
325
+ if(sockfd == -1){
326
+
327
+ printf("client socket error\n");
328
+
329
+ }else{
330
+
331
+ printf("client socket OK\n");
332
+
333
+ }
334
+
335
+ address.sin_family = AF_INET ;
336
+
337
+ address.sin_addr.s_addr = inet_addr(ip);
338
+
339
+ address.sin_port = htons(port) ;
340
+
341
+ len = sizeof(address);
342
+
343
+
344
+
345
+ result = connect(sockfd , (struct sockaddr *)&address , len);
346
+
347
+ printf("result =%d\n",result);
348
+
349
+ if ( result == -1 ) {
350
+
351
+ perror("oops: client3");
352
+
353
+ exit(1);
354
+
355
+ }
356
+
357
+ readwrite(sockfd);
358
+
359
+ }
360
+
361
+
362
+
363
+ //iniファイル読み込み
364
+
365
+ int inifile(char *pa){
366
+
367
+ int i = 0, j = 0;
368
+
369
+ char str[STR_MAX];
370
+
371
+ FILE *fin;
372
+
373
+
374
+
375
+ //ファイルオープン
376
+
377
+ if((fin = fopen(INI_FILE,"r")) == NULL){
378
+
379
+ printf("fin error:[%s]\n",INI_FILE);
380
+
381
+ return -1;
382
+
383
+ }
384
+
385
+
386
+
387
+
388
+
389
+ for(;;){
390
+
391
+ if(fgets(str, STR_MAX, fin) == NULL){
392
+
393
+ fclose(fin);
394
+
395
+ return -3;
396
+
397
+ }else{
398
+
399
+ }
400
+
401
+
402
+
403
+ if(!strncmp(str,pa,strlen(pa))) {
404
+
405
+ while(str[i++] != '='){
406
+
407
+ ;
408
+
409
+ }
410
+
411
+ while(str[i] != '\n'){
412
+
413
+ param[j++] = str[i++];
414
+
415
+ }
416
+
417
+ param[j] = '\0';
418
+
419
+ printf("param = %s\n",param);
420
+
421
+ //ファイルクローズ
422
+
423
+ fclose(fin);
424
+
425
+ return;
426
+
427
+ }else{
428
+
429
+
430
+
431
+ }
432
+
433
+ }
434
+
435
+ //ファイルクローズ
436
+
437
+ fclose(fin);
438
+
439
+ return -1;
440
+
441
+ }
442
+
443
+
444
+
445
+ ### 試したこと
446
+
447
+
448
+
449
+ int型にキャストしたりしましたがエラーメッセージは変わりませんでした
450
+
451
+ inet_addr(*ip);
452
+
453
+ にした場合のみコアダンプとなります。
454
+
455
+
456
+
457
+ ### 補足情報(FW/ツールのバージョンなど)
458
+
459
+ エラーに関係のない関数は記載していません。