質問編集履歴

1

自分で書いた部分のコメント追加

2019/05/18 03:19

投稿

mercury
mercury

スコア11

test CHANGED
File without changes
test CHANGED
@@ -178,7 +178,7 @@
178
178
 
179
179
  }
180
180
 
181
- for (i = 0;i < 3;i++) {
181
+ for (i = 0;i < 3;i++) { //ここから
182
182
 
183
183
  if (i == 0) {
184
184
 
@@ -196,63 +196,297 @@
196
196
 
197
197
  break;
198
198
 
199
+ }                  //ここまで自分で追加した場所です
200
+
201
+
202
+
203
+ if (StrBuf == '.')
204
+
205
+ break;
206
+
207
+
208
+
209
+
210
+
211
+
212
+
213
+
214
+
215
+ /******** 受信したデータ(文字列)をホスト画面に表示 *********/
216
+
217
+
218
+
219
+ if (i == 3) { //ここから
220
+
221
+ if (strcmp(word[0], "add") == 0) {
222
+
223
+ a = atoi(word[1]);
224
+
225
+ b = atoi(word[2]);
226
+
227
+ res = a + b;
228
+
229
+ sprintf(StrBuf, "%d+%d=%d\n", a, b, res);
230
+
231
+ }
232
+
233
+ else {
234
+
235
+ sprintf(StrBuf, "[%s %s %s]の計算はできません", word[0], word[1], word[2]);
236
+
237
+ }
238
+
199
239
  }
200
240
 
201
-
241
+ else {
242
+
202
-
243
+ sprintf(StrBuf, "[%s]数式ではありません\n", StrBuf);
244
+
245
+ }                       //ここまで自分で追加した場所です
246
+
247
+
248
+
249
+
250
+
251
+ /******** 文字列の送信 *********/
252
+
253
+ send(DataSocket, StrBuf, (int)strlen(StrBuf), 0);
254
+
255
+
256
+
257
+ }
258
+
259
+
260
+
261
+
262
+
263
+ // ソケット終了処理
264
+
265
+ closesocket( DataSocket ); //ソケットのクローズ
266
+
267
+ WSACleanup(); //ソケットの破棄
268
+
269
+
270
+
271
+ printf("\n\nEnterキーを1,2回押してプログラム終了");
272
+
273
+ getchar(); //プログラム一時停止(キー入力待ち)
274
+
275
+ getchar(); //プログラム一時停止(キー入力待ち)
276
+
277
+
278
+
279
+ return(0);
280
+
281
+ }
282
+
283
+
284
+
285
+ ```
286
+
287
+ ↓クライアント側のプログラム
288
+
289
+ ```c
290
+
291
+ #include <winsock.h> //Windows用ソケットライブラリ用
292
+
293
+ #include <stdio.h>
294
+
295
+ #include <stdlib.h>
296
+
297
+ #include <string.h>
298
+
299
+ #include <ctype.h>
300
+
301
+
302
+
303
+ #pragma comment(lib,"wsock32.lib") //WinSockライブラリをリンク
304
+
305
+
306
+
307
+ #define MAX_BUFF_12A 1024 // バッファの長さ
308
+
309
+
310
+
311
+ int NetPortNo = 10010;
312
+
313
+ char HostAddr[50] = "127.0.0.1";
314
+
315
+
316
+
317
+ //
318
+
319
+ // main
320
+
321
+ //
322
+
323
+ int main( void )
324
+
325
+ {
326
+
327
+ char StrBuf[MAX_BUFF_12A+1] ;
328
+
329
+ char szHost[MAX_BUFF_12A+1];
330
+
331
+ SOCKET DataSocket;
332
+
333
+ WSADATA wsaData;
334
+
335
+ SOCKADDR_IN server;
336
+
337
+ HOSTENT *hostEnt;
338
+
339
+ int rVal;
340
+
341
+ WORD wVersionRequested;
342
+
343
+ unsigned int addr;
344
+
345
+
346
+
347
+ // ソケットの初期化(ウィンドウズ用Winsockの初期化)
348
+
349
+ wVersionRequested = MAKEWORD( 1, 1 );
350
+
351
+ rVal = WSAStartup( wVersionRequested, &wsaData ); //初期化の関数
352
+
353
+ if(rVal != 0 ) { //初期化のエラー
354
+
355
+ printf("エラー:ソケット初期化・・・終了します\n");
356
+
357
+ WSACleanup();
358
+
359
+ return(-1);
360
+
361
+ }
362
+
363
+
364
+
365
+ // ソケット生成(TCPソケット)
366
+
367
+ DataSocket = socket( AF_INET, SOCK_STREAM, 0 ) ; // ソケット生成の関数
368
+
369
+
370
+
371
+ if( DataSocket < 0 ) { printf("エラー:ソケット生成・・・終了します\n"); return(-1);}
372
+
373
+
374
+
375
+
376
+
377
+ printf("サーバのホスト名(またはIPアドレス):"); scanf("%s",HostAddr);
378
+
379
+ printf("サーバのポート番号:"); scanf("%d",&NetPortNo);
380
+
381
+
382
+
383
+
384
+
385
+
386
+
387
+ // サーバ情報の取得
388
+
389
+ strcpy( szHost, HostAddr );
390
+
391
+ if( isalpha( szHost[0] ) ) { // 名前の場合
392
+
393
+ hostEnt = gethostbyname( szHost ); //DNSへ問合せ
394
+
395
+ }
396
+
397
+ else { // IPアドレスの場合
398
+
399
+ addr = inet_addr( szHost );
400
+
401
+ hostEnt = gethostbyaddr( (char*)&addr, 4, AF_INET );
402
+
403
+ }
404
+
405
+ if( hostEnt == NULL ) { printf("エラー:アドレスを解決不能[%s]\n・・終了!\n", szHost);return(-1); }
406
+
407
+
408
+
409
+ printf("******クライアントの起動*****\n");
410
+
411
+ // サーバ接続のための初期化
412
+
413
+ memset( &server, 0, sizeof(server) );
414
+
415
+ memcpy( &(server.sin_addr), hostEnt->h_addr, hostEnt->h_length );
416
+
417
+
418
+
419
+ server.sin_family = hostEnt->h_addrtype;
420
+
421
+ server.sin_addr.s_addr = *(( unsigned long*)hostEnt->h_addr ); //サーバアドレス
422
+
423
+
424
+
425
+ server.sin_port = htons( (unsigned short)NetPortNo );
426
+
427
+
428
+
429
+ // サーバへ接続を試みる(connect関数)
430
+
431
+ printf("サーバ[%s]へ接続中...", szHost ) ;
432
+
433
+ if( connect( DataSocket,(struct sockaddr*)&server, sizeof(server) )
434
+
435
+ == SOCKET_ERROR) {
436
+
437
+ printf("エラー:サーバへの接続(connect)\n・・・終了します\n"); return(-1); }
438
+
439
+
440
+
441
+ printf("%sに接続完了しました\n", szHost );
442
+
443
+
444
+
445
+
446
+
447
+
448
+
449
+ /******** 文字列のキーボードからの読込み *********/
450
+
451
+ while (1) {
452
+
453
+ printf("文字列を入力:");
454
+
455
+ scanf("%s", StrBuf);
456
+
457
+ getchar();
458
+
459
+
460
+
461
+ /******** 文字列の送信 *********/
462
+
463
+ send(DataSocket, StrBuf, (int)strlen(StrBuf), 0); //送信(send関数)
464
+
203
- if (StrBuf == '.')
465
+ if (StrBuf[0] == '.')
204
466
 
205
467
  break;
206
468
 
207
-
208
-
209
-
210
-
211
-
212
-
213
-
214
-
215
- /******** 受信したデータ(文字列)をホスト画面に表示 *********/
469
+ /******** データの受信 ********/
216
-
217
-
218
-
470
+
219
- if (i == 3) {
471
+ rVal = recv(DataSocket, StrBuf, sizeof(StrBuf), 0); //受信(recv関数)
472
+
220
-
473
+ StrBuf[rVal] = '\0'; //受信したデータ(文字列)の最後にNULL文字付加
474
+
475
+
476
+
221
- if (strcmp(word[0], "add") == 0) {
477
+ if (rVal == SOCKET_ERROR || rVal == 0) { //受信時エラー(または切断)
222
-
223
- a = atoi(word[1]);
478
+
224
-
225
- b = atoi(word[2]);
226
-
227
- res = a + b;
228
-
229
- sprintf(StrBuf, "%d+%d=%d\n", a, b, res);
479
+ printf("エラー:相手からの切断されました\n・・・終了します\n");
230
-
231
- }
480
+
232
-
233
- else {
234
-
235
- sprintf(StrBuf, "[%s %s %s]の計算できません", word[0], word[1], word[2]);
481
+ break; // ←← 問題A2以降コメントを外す
236
-
237
- }
238
482
 
239
483
  }
240
484
 
241
- else {
485
+
242
-
486
+
243
- sprintf(StrBuf, "[%s]数式ではありません\n", StrBuf);
487
+ // メッセージを表示する
244
-
245
- }
488
+
246
-
247
- printf("%d", StrBuf);
489
+ printf("受信文字列:%s\n", StrBuf);
248
-
249
-
250
-
251
- /******** 文字列の送信 *********/
252
-
253
- send(DataSocket, StrBuf, (int)strlen(StrBuf), 0);
254
-
255
-
256
490
 
257
491
  }
258
492
 
@@ -260,7 +494,9 @@
260
494
 
261
495
 
262
496
 
497
+
498
+
263
- // ソケット終了処理
499
+ // ソケット終了処理
264
500
 
265
501
  closesocket( DataSocket ); //ソケットのクローズ
266
502
 
@@ -283,239 +519,3 @@
283
519
 
284
520
 
285
521
  ```
286
-
287
- ↓クライアント側のプログラム
288
-
289
- ```c
290
-
291
- #include <winsock.h> //Windows用ソケットライブラリ用
292
-
293
- #include <stdio.h>
294
-
295
- #include <stdlib.h>
296
-
297
- #include <string.h>
298
-
299
- #include <ctype.h>
300
-
301
-
302
-
303
- #pragma comment(lib,"wsock32.lib") //WinSockライブラリをリンク
304
-
305
-
306
-
307
- #define MAX_BUFF_12A 1024 // バッファの長さ
308
-
309
-
310
-
311
- int NetPortNo = 10010;
312
-
313
- char HostAddr[50] = "127.0.0.1";
314
-
315
-
316
-
317
- //
318
-
319
- // main
320
-
321
- //
322
-
323
- int main( void )
324
-
325
- {
326
-
327
- char StrBuf[MAX_BUFF_12A+1] ;
328
-
329
- char szHost[MAX_BUFF_12A+1];
330
-
331
- SOCKET DataSocket;
332
-
333
- WSADATA wsaData;
334
-
335
- SOCKADDR_IN server;
336
-
337
- HOSTENT *hostEnt;
338
-
339
- int rVal;
340
-
341
- WORD wVersionRequested;
342
-
343
- unsigned int addr;
344
-
345
-
346
-
347
- // ソケットの初期化(ウィンドウズ用Winsockの初期化)
348
-
349
- wVersionRequested = MAKEWORD( 1, 1 );
350
-
351
- rVal = WSAStartup( wVersionRequested, &wsaData ); //初期化の関数
352
-
353
- if(rVal != 0 ) { //初期化のエラー
354
-
355
- printf("エラー:ソケット初期化・・・終了します\n");
356
-
357
- WSACleanup();
358
-
359
- return(-1);
360
-
361
- }
362
-
363
-
364
-
365
- // ソケット生成(TCPソケット)
366
-
367
- DataSocket = socket( AF_INET, SOCK_STREAM, 0 ) ; // ソケット生成の関数
368
-
369
-
370
-
371
- if( DataSocket < 0 ) { printf("エラー:ソケット生成・・・終了します\n"); return(-1);}
372
-
373
-
374
-
375
-
376
-
377
- printf("サーバのホスト名(またはIPアドレス):"); scanf("%s",HostAddr);
378
-
379
- printf("サーバのポート番号:"); scanf("%d",&NetPortNo);
380
-
381
-
382
-
383
-
384
-
385
-
386
-
387
- // サーバ情報の取得
388
-
389
- strcpy( szHost, HostAddr );
390
-
391
- if( isalpha( szHost[0] ) ) { // 名前の場合
392
-
393
- hostEnt = gethostbyname( szHost ); //DNSへ問合せ
394
-
395
- }
396
-
397
- else { // IPアドレスの場合
398
-
399
- addr = inet_addr( szHost );
400
-
401
- hostEnt = gethostbyaddr( (char*)&addr, 4, AF_INET );
402
-
403
- }
404
-
405
- if( hostEnt == NULL ) { printf("エラー:アドレスを解決不能[%s]\n・・終了!\n", szHost);return(-1); }
406
-
407
-
408
-
409
- printf("******クライアントの起動*****\n");
410
-
411
- // サーバ接続のための初期化
412
-
413
- memset( &server, 0, sizeof(server) );
414
-
415
- memcpy( &(server.sin_addr), hostEnt->h_addr, hostEnt->h_length );
416
-
417
-
418
-
419
- server.sin_family = hostEnt->h_addrtype;
420
-
421
- server.sin_addr.s_addr = *(( unsigned long*)hostEnt->h_addr ); //サーバアドレス
422
-
423
-
424
-
425
- server.sin_port = htons( (unsigned short)NetPortNo );
426
-
427
-
428
-
429
- // サーバへ接続を試みる(connect関数)
430
-
431
- printf("サーバ[%s]へ接続中...", szHost ) ;
432
-
433
- if( connect( DataSocket,(struct sockaddr*)&server, sizeof(server) )
434
-
435
- == SOCKET_ERROR) {
436
-
437
- printf("エラー:サーバへの接続(connect)\n・・・終了します\n"); return(-1); }
438
-
439
-
440
-
441
- printf("%sに接続完了しました\n", szHost );
442
-
443
-
444
-
445
-
446
-
447
-
448
-
449
- /******** 文字列のキーボードからの読込み *********/
450
-
451
- while (1) {
452
-
453
- printf("文字列を入力:");
454
-
455
- scanf("%s", StrBuf);
456
-
457
- getchar();
458
-
459
-
460
-
461
- /******** 文字列の送信 *********/
462
-
463
- send(DataSocket, StrBuf, (int)strlen(StrBuf), 0); //送信(send関数)
464
-
465
- if (StrBuf[0] == '.')
466
-
467
- break;
468
-
469
- /******** データの受信 ********/
470
-
471
- rVal = recv(DataSocket, StrBuf, sizeof(StrBuf), 0); //受信(recv関数)
472
-
473
- StrBuf[rVal] = '\0'; //受信したデータ(文字列)の最後にNULL文字付加
474
-
475
-
476
-
477
- if (rVal == SOCKET_ERROR || rVal == 0) { //受信時エラー(または切断)
478
-
479
- printf("エラー:相手からの切断されました\n・・・終了します\n");
480
-
481
- break; // ←← 問題A2以降はコメントを外す
482
-
483
- }
484
-
485
-
486
-
487
- // メッセージを表示する
488
-
489
- printf("受信文字列:%s\n", StrBuf);
490
-
491
- }
492
-
493
-
494
-
495
-
496
-
497
-
498
-
499
- // ソケット終了処理
500
-
501
- closesocket( DataSocket ); //ソケットのクローズ
502
-
503
- WSACleanup(); //ソケットの破棄
504
-
505
-
506
-
507
- printf("\n\nEnterキーを1,2回押してプログラム終了");
508
-
509
- getchar(); //プログラム一時停止(キー入力待ち)
510
-
511
- getchar(); //プログラム一時停止(キー入力待ち)
512
-
513
-
514
-
515
- return(0);
516
-
517
- }
518
-
519
-
520
-
521
- ```