質問編集履歴

5

ソースプログラムの訂正

2019/07/18 15:27

投稿

mdkmdk
mdkmdk

スコア11

test CHANGED
File without changes
test CHANGED
@@ -24,11 +24,11 @@
24
24
 
25
25
 
26
26
 
27
- C言語(C++)
27
+ ```C
28
-
28
+
29
- ソースコード```
29
+ コード
30
-
30
+
31
- ```>#include <winsock.h> //Windows用ソケットライブラリ用
31
+ ```#include <winsock.h> //Windows用ソケットライブラリ用
32
32
 
33
33
  #include <stdio.h>
34
34
 
@@ -560,24 +560,12 @@
560
560
 
561
561
 
562
562
 
563
- } ここに言語を入力
563
+ } ```
564
564
 
565
565
  コード
566
566
 
567
567
  ```
568
568
 
569
- コード
570
-
571
- ```
572
-
573
- コード
574
-
575
- ```
576
-
577
- コード
578
-
579
- ```
580
-
581
569
  ### 試したこと
582
570
 
583
571
 

4

ソースプログラムの訂正

2019/07/18 15:27

投稿

mdkmdk
mdkmdk

スコア11

test CHANGED
File without changes
test CHANGED
@@ -26,9 +26,9 @@
26
26
 
27
27
  C言語(C++)
28
28
 
29
- ソースコード
29
+ ソースコード```
30
-
30
+
31
- ```#include <winsock.h> //Windows用ソケットライブラリ用
31
+ ```>#include <winsock.h> //Windows用ソケットライブラリ用
32
32
 
33
33
  #include <stdio.h>
34
34
 
@@ -560,9 +560,7 @@
560
560
 
561
561
 
562
562
 
563
- }
564
-
565
- //エラーは0で警告が24と出ています
563
+ } ここに言語を入力
566
564
 
567
565
  コード
568
566
 
@@ -572,6 +570,14 @@
572
570
 
573
571
  ```
574
572
 
573
+ コード
574
+
575
+ ```
576
+
577
+ コード
578
+
579
+ ```
580
+
575
581
  ### 試したこと
576
582
 
577
583
 

3

警告の追加

2019/07/18 15:01

投稿

mdkmdk
mdkmdk

スコア11

test CHANGED
File without changes
test CHANGED
@@ -562,6 +562,8 @@
562
562
 
563
563
  }
564
564
 
565
+ //エラーは0で警告が24と出ています
566
+
565
567
  コード
566
568
 
567
569
  ```

2

ソースプログラムの追加

2019/07/18 14:17

投稿

mdkmdk
mdkmdk

スコア11

test CHANGED
File without changes
test CHANGED
@@ -28,7 +28,293 @@
28
28
 
29
29
  ソースコード
30
30
 
31
+ ```#include <winsock.h> //Windows用ソケットライブラリ用
32
+
33
+ #include <stdio.h>
34
+
35
+ #include <stdlib.h>
36
+
37
+ #include <string.h>
38
+
39
+ #include <ctype.h>
40
+
41
+
42
+
43
+ #pragma comment(lib,"wsock32.lib") //WinSockライブラリをリンク
44
+
45
+
46
+
47
+ #define MAX_BUFF_12A 1024 // バッファの長さ
48
+
49
+
50
+
51
+ int ServerPort = 15050; // サーバーのポート番号
52
+
53
+
54
+
55
+ //
56
+
57
+ // メイン関数
58
+
59
+ //
60
+
31
- ↓クライアントのソースプログラム
61
+ int main(void) {
62
+
63
+
64
+
65
+ char StrBuf[MAX_BUFF_12A + 1];
66
+
67
+ SOCKET DataSocket; //送受信用ソケット
68
+
69
+ WSADATA wsaData;
70
+
71
+ SOCKADDR_IN local; //このサーバアプリのソケット情報
72
+
73
+ WORD wVersionRequested;
74
+
75
+ int rVal;
76
+
77
+ SOCKADDR_IN from; //受信(recvfrom)の時の送信元アドレス・ポート番号情報
78
+
79
+ int fromlen = sizeof(from);
80
+
81
+
82
+
83
+
84
+
85
+ // ソケットの初期化(ウィンドウズ用Winsockの初期化)
86
+
87
+ wVersionRequested = MAKEWORD(1, 1);
88
+
89
+ rVal = WSAStartup(wVersionRequested, &wsaData); //初期化の関数
90
+
91
+ if (rVal != 0) { //初期化のエラー
92
+
93
+ printf("エラー:ソケット初期化・・・終了します\n");
94
+
95
+ WSACleanup();
96
+
97
+ return(-1);
98
+
99
+ }
100
+
101
+
102
+
103
+ printf("******UDP型サーバの起動*****\n");
104
+
105
+ printf("サーバ起動時のポート番号(1024以上):");
106
+
107
+ scanf("%d", &ServerPort);
108
+
109
+ FILE *infp;
110
+
111
+
112
+
113
+ char infname[50];
114
+
115
+ char outfname[50];
116
+
117
+
118
+
119
+ printf("読込むファイル名:");
120
+
121
+ scanf("%s", infname);
122
+
123
+ infp = fopen(infname, "r");
124
+
125
+ if (infp == NULL) {
126
+
127
+ printf("ファイル%sがオープンできません\n", infname);
128
+
129
+ return -1;
130
+
131
+ }
132
+
133
+ printf("書き込むファイル名:");
134
+
135
+ scanf("%s", outfname);
136
+
137
+
138
+
139
+ send(DataSocket, outfname, (int)strlen(outfname), 0); //送信(send関数)
140
+
141
+
142
+
143
+ while (1) {
144
+
145
+ if (fgets(StrBuf, 1023, infp) == NULL)
146
+
147
+ break;
148
+
149
+
150
+
151
+
152
+
153
+ /******** 文字列の送信 *********/
154
+
155
+ send(DataSocket, StrBuf, (int)strlen(StrBuf), 0); //送信(send関数)
156
+
157
+
158
+
159
+
160
+
161
+ // メッセージを表示する
162
+
163
+ //printf("受信文字列:%s\n", StrBuf);
164
+
165
+
166
+
167
+ }
168
+
169
+ fclose(infp);
170
+
171
+
172
+
173
+
174
+
175
+ // ソケット生成用のSOCKADDR_IN構造体の設定
176
+
177
+ memset(&local, 0, sizeof(local));
178
+
179
+ local.sin_family = AF_INET;
180
+
181
+ local.sin_addr.s_addr = htonl(INADDR_ANY);
182
+
183
+ local.sin_port = htons((unsigned short)ServerPort); //ポート番号の設定
184
+
185
+
186
+
187
+ //************************************************************
188
+
189
+ // ソケット生成(TCPソケット:DGRAM型)
190
+
191
+ //************************************************************
192
+
193
+ DataSocket = socket(AF_INET, SOCK_DGRAM, 0); //ソケット生成:DGRAM→UDP型
194
+
195
+
196
+
197
+ if (DataSocket < 0) {
198
+
199
+ printf("エラー:ソケット生成・・・終了します\n");
200
+
201
+ WSACleanup();
202
+
203
+ return(-1);
204
+
205
+ }
206
+
207
+
208
+
209
+ // 生成したソケットにバインド
210
+
211
+ if (bind(DataSocket, (LPSOCKADDR)&local, sizeof(local)) == SOCKET_ERROR) {
212
+
213
+ printf("エラー:バインドbind・・・終了します\n");
214
+
215
+ closesocket(DataSocket);
216
+
217
+ WSACleanup();
218
+
219
+ return(-1);
220
+
221
+
222
+
223
+ }
224
+
225
+
226
+
227
+ printf("ポート番号%dでbind\n", ServerPort);
228
+
229
+
230
+
231
+ while (1) {
232
+
233
+ /******** データの受信 ********/
234
+
235
+ FILE *outfp;
236
+
237
+ char outfname[50];
238
+
239
+
240
+
241
+ /******** データの受信 ********/
242
+
243
+ rVal = recv(DataSocket, outfname, sizeof(outfname), 0);
244
+
245
+ outfname[rVal] = '\0'; //受信したデータ(文字列)の最後にNULL文字付加
246
+
247
+
248
+
249
+ if (rVal == SOCKET_ERROR || rVal == 0) { //受信時エラー(または切断)
250
+
251
+ printf("エラー:相手からの切断されました\n・・・終了します\n");
252
+
253
+ closesocket(DataSocket);
254
+
255
+ WSACleanup();
256
+
257
+ return -1;
258
+
259
+ }
260
+
261
+ outfp = fopen(outfname, "w");
262
+
263
+
264
+
265
+ while (1) {
266
+
267
+ /******** データの受信 ********/
268
+
269
+
270
+
271
+ rVal = recv(DataSocket, StrBuf, sizeof(StrBuf), 0);
272
+
273
+ StrBuf[rVal] = '\0'; //受信したデータ(文字列)の最後にNULL文字付加
274
+
275
+ if (rVal == SOCKET_ERROR || rVal == 0) { //受信時エラー(または切断)
276
+
277
+ //printf("エラー:相手からの切断されました\n・・・終了します\n");
278
+
279
+ break; // ←← 問題A2以降はコメントを外す
280
+
281
+ }
282
+
283
+
284
+
285
+ fputs(StrBuf, outfp);
286
+
287
+
288
+
289
+
290
+
291
+
292
+
293
+ }
294
+
295
+ fclose(outfp);
296
+
297
+
298
+
299
+ closesocket(DataSocket); //ソケットのクローズ
300
+
301
+ WSACleanup(); //ソケットの破棄
302
+
303
+
304
+
305
+ printf("\n\nEnterキーを1,2回押してプログラム終了");
306
+
307
+ getchar(); //プログラム一時停止(キー入力待ち)
308
+
309
+ getchar(); //プログラム一時停止(キー入力待ち)
310
+
311
+
312
+
313
+ return(0);
314
+
315
+ }
316
+
317
+ }```
32
318
 
33
319
  #include <winsock.h> //Windows用ソケットライブラリ用
34
320
 
@@ -126,7 +412,7 @@
126
412
 
127
413
  printf("******UDP型クライアントの起動*****\n");
128
414
 
129
-
415
+
130
416
 
131
417
  printf("サーバのホスト名(またはIPアドレス:)");
132
418
 
@@ -136,6 +422,8 @@
136
422
 
137
423
 
138
424
 
425
+
426
+
139
427
  // サーバ情報の取得
140
428
 
141
429
  strcpy(szHost, HostAddr); //サーバ名(名前またはIP)をszHostへコピー
@@ -182,6 +470,8 @@
182
470
 
183
471
 
184
472
 
473
+
474
+
185
475
  while (1) {
186
476
 
187
477
  FILE *infp;
@@ -248,6 +538,8 @@
248
538
 
249
539
 
250
540
 
541
+
542
+
251
543
  // ソケット終了処理
252
544
 
253
545
  closesocket(DataSocket); //ソケットのクローズ
@@ -270,301 +562,13 @@
270
562
 
271
563
  }
272
564
 
273
-
274
-
275
- ↓サーバのソースプログラム
276
-
277
- #include <winsock.h> //Windows用ソケットライブラリ用
278
-
279
- #include <stdio.h>
280
-
281
- #include <stdlib.h>
282
-
283
- #include <string.h>
284
-
285
- #include <ctype.h>
286
-
287
-
288
-
289
- #pragma comment(lib,"wsock32.lib") //WinSockライブラリをリンク
290
-
291
-
292
-
293
- #define MAX_BUFF_12A 1024 // バッファの長さ
294
-
295
-
296
-
297
- int ServerPort = 15050; // サーバーのポート番号
298
-
299
-
300
-
301
- //
302
-
303
- // メイン関数
304
-
305
- //
306
-
307
- int main(void) {
308
-
309
-
310
-
311
- char StrBuf[MAX_BUFF_12A + 1];
312
-
313
- SOCKET DataSocket; //送受信用ソケット
314
-
315
- WSADATA wsaData;
316
-
317
- SOCKADDR_IN local; //このサーバアプリのソケット情報
318
-
319
- WORD wVersionRequested;
320
-
321
- int rVal;
322
-
323
- SOCKADDR_IN from; //受信(recvfrom)の時の送信元アドレス・ポート番号情報
324
-
325
- int fromlen = sizeof(from);
326
-
327
-
328
-
329
-
330
-
331
- // ソケットの初期化(ウィンドウズ用Winsockの初期化)
332
-
333
- wVersionRequested = MAKEWORD(1, 1);
334
-
335
- rVal = WSAStartup(wVersionRequested, &wsaData); //初期化の関数
336
-
337
- if (rVal != 0) { //初期化のエラー
338
-
339
- printf("エラー:ソケット初期化・・・終了します\n");
340
-
341
- WSACleanup();
342
-
343
- return(-1);
344
-
345
- }
346
-
347
-
348
-
349
- printf("******UDP型サーバの起動*****\n");
350
-
351
- printf("サーバ起動時のポート番号(1024以上):");
352
-
353
- scanf("%d", &ServerPort);
354
-
355
- FILE *infp;
356
-
357
-
358
-
359
- char infname[50];
360
-
361
- char outfname[50];
362
-
363
-
364
-
365
- printf("読込むファイル名:");
366
-
367
- scanf("%s", infname);
368
-
369
- infp = fopen(infname, "r");
370
-
371
- if (infp == NULL) {
372
-
373
- printf("ファイル%sがオープンできません\n", infname);
374
-
375
- return -1;
376
-
377
- }
378
-
379
- printf("書き込むファイル名:");
380
-
381
- scanf("%s", outfname);
382
-
383
-
384
-
385
- send(DataSocket, outfname, (int)strlen(outfname), 0); //送信(send関数)
386
-
387
-
388
-
389
- while (1) {
390
-
391
- if (fgets(StrBuf, 1023, infp) == NULL)
392
-
393
- break;
565
+ コード
394
-
395
-
396
-
397
-
398
-
399
- /******** 文字列の送信 *********/
566
+
400
-
401
- send(DataSocket, StrBuf, (int)strlen(StrBuf), 0); //送信(send関数)
402
-
403
-
404
-
405
-
406
-
407
- // メッセージを表示する
408
-
409
- //printf("受信文字列:%s\n", StrBuf);
410
-
411
-
412
-
413
- }
567
+ ```
414
-
415
- fclose(infp);
568
+
416
-
417
-
418
-
419
-
420
-
421
-
422
-
423
- // ソケット生成用のSOCKADDR_IN構造体の設定
424
-
425
- memset(&local, 0, sizeof(local));
426
-
427
- local.sin_family = AF_INET;
428
-
429
- local.sin_addr.s_addr = htonl(INADDR_ANY);
430
-
431
- local.sin_port = htons((unsigned short)ServerPort); //ポート番号の設定
432
-
433
-
434
-
435
- //************************************************************
436
-
437
- // ソケット生成(TCPソケット:DGRAM型)
438
-
439
- //************************************************************
440
-
441
- DataSocket = socket(AF_INET, SOCK_DGRAM, 0); //ソケット生成:DGRAM→UDP型
442
-
443
-
444
-
445
- if (DataSocket < 0) {
446
-
447
- printf("エラー:ソケット生成・・・終了します\n");
448
-
449
- WSACleanup();
450
-
451
- return(-1);
452
-
453
- }
569
+ コード
454
-
455
-
456
-
457
- // 生成したソケットにバインド
570
+
458
-
459
- if (bind(DataSocket, (LPSOCKADDR)&local, sizeof(local)) == SOCKET_ERROR) {
460
-
461
- printf("エラー:バインドbind・・・終了します\n");
462
-
463
- closesocket(DataSocket);
464
-
465
- WSACleanup();
466
-
467
- return(-1);
468
-
469
-
470
-
471
- }
571
+ ```
472
-
473
-
474
-
475
- printf("ポート番号%dでbind\n", ServerPort);
476
-
477
-
478
-
479
- while (1) {
480
-
481
- /******** データの受信 ********/
482
-
483
- FILE *outfp;
484
-
485
- char outfname[50];
486
-
487
-
488
-
489
- /******** データの受信 ********/
490
-
491
- rVal = recv(DataSocket, outfname, sizeof(outfname), 0);
492
-
493
- outfname[rVal] = '\0'; //受信したデータ(文字列)の最後にNULL文字付加
494
-
495
-
496
-
497
- if (rVal == SOCKET_ERROR || rVal == 0) { //受信時エラー(または切断)
498
-
499
- printf("エラー:相手からの切断されました\n・・・終了します\n");
500
-
501
- closesocket(DataSocket);
502
-
503
- WSACleanup();
504
-
505
- return -1;
506
-
507
- }
508
-
509
- outfp = fopen(outfname, "w");
510
-
511
-
512
-
513
- while (1) {
514
-
515
- /******** データの受信 ********/
516
-
517
-
518
-
519
- rVal = recv(DataSocket, StrBuf, sizeof(StrBuf), 0);
520
-
521
- StrBuf[rVal] = '\0'; //受信したデータ(文字列)の最後にNULL文字付加
522
-
523
- if (rVal == SOCKET_ERROR || rVal == 0) { //受信時エラー(または切断)
524
-
525
- //printf("エラー:相手からの切断されました\n・・・終了します\n");
526
-
527
- break; // ←← 問題A2以降はコメントを外す
528
-
529
- }
530
-
531
-
532
-
533
- fputs(StrBuf, outfp);
534
-
535
-
536
-
537
-
538
-
539
-
540
-
541
- }
542
-
543
- fclose(outfp);
544
-
545
-
546
-
547
- closesocket(DataSocket); //ソケットのクローズ
548
-
549
- WSACleanup(); //ソケットの破棄
550
-
551
-
552
-
553
- printf("\n\nEnterキーを1,2回押してプログラム終了");
554
-
555
- getchar(); //プログラム一時停止(キー入力待ち)
556
-
557
- getchar(); //プログラム一時停止(キー入力待ち)
558
-
559
-
560
-
561
- return(0);
562
-
563
- }
564
-
565
- }
566
-
567
-
568
572
 
569
573
  ### 試したこと
570
574
 

1

ソースプログラムの追加

2019/07/18 14:14

投稿

mdkmdk
mdkmdk

スコア11

test CHANGED
@@ -1 +1 @@
1
- UDPのプログラムちんと組み立てられません
1
+ UDPのプログラムを正しく書たい
test CHANGED
@@ -28,7 +28,541 @@
28
28
 
29
29
  ソースコード
30
30
 
31
+ ↓クライアントのソースプログラム
32
+
33
+ #include <winsock.h> //Windows用ソケットライブラリ用
34
+
35
+ #include <stdio.h>
36
+
37
+ #include <stdlib.h>
38
+
39
+ #include <string.h>
40
+
41
+ #include <ctype.h>
42
+
43
+
44
+
45
+ #pragma comment(lib,"wsock32.lib") //WinSockライブラリをリンク
46
+
47
+
48
+
49
+ #define MAX_BUFF_12A 1024 // バッファの長さ
50
+
51
+
52
+
53
+ int NetPortNo = 15050;
54
+
55
+ char HostAddr[50] = "127.0.0.1";
56
+
57
+
58
+
59
+ //
60
+
61
+ // メイン関数
62
+
63
+ //
64
+
65
+ int main(void)
66
+
67
+ {
68
+
69
+ char StrBuf[MAX_BUFF_12A + 1];
70
+
71
+ SOCKET DataSocket; //送受信用ソケット
72
+
73
+ WSADATA wsaData;
74
+
75
+ WORD wVersionRequested;
76
+
77
+ int rVal;
78
+
79
+ int nEnable = 1;
80
+
81
+ SOCKADDR_IN server; //サーバのアドレス・ポート番号情報
82
+
83
+ HOSTENT *hostEnt;
84
+
85
+ char szHost[MAX_BUFF_12A + 1];
86
+
87
+ unsigned int addr;
88
+
89
+ SOCKADDR_IN from; //受信(recvfrom)の時の送信元アドレス・ポート番号情報
90
+
91
+ int fromlen = sizeof(from);
92
+
93
+
94
+
95
+
96
+
97
+ // ソケットの初期化(ウィンドウズ用Winsockの初期化)
98
+
99
+ wVersionRequested = MAKEWORD(1, 1);
100
+
101
+ rVal = WSAStartup(wVersionRequested, &wsaData); //初期化の関数
102
+
103
+ if (rVal != 0) { //初期化のエラー
104
+
105
+ printf("エラー:ソケット初期化・・・終了します\n");
106
+
107
+ WSACleanup();
108
+
109
+ return(-1);
110
+
111
+ }
112
+
113
+
114
+
115
+ // ソケット生成(TCPソケット)
116
+
117
+ DataSocket = socket(AF_INET, SOCK_DGRAM, 0); // ソケット生成:DGRAM→UDP型
118
+
119
+ if (DataSocket < 0) {
120
+
121
+ printf("エラー:ソケット生成・・・終了します\n"); return(-1);
122
+
123
+ }
124
+
125
+
126
+
127
+ printf("******UDP型クライアントの起動*****\n");
128
+
129
+
130
+
131
+ printf("サーバのホスト名(またはIPアドレス:)");
132
+
133
+ scanf("%s", StrBuf[50]);
134
+
135
+
136
+
137
+
138
+
139
+ // サーバ情報の取得
140
+
141
+ strcpy(szHost, HostAddr); //サーバ名(名前またはIP)をszHostへコピー
142
+
143
+ if (isalpha(szHost[0])) { // 名前の場合
144
+
145
+ hostEnt = gethostbyname(szHost); //DNSへ問合せ
146
+
147
+ }
148
+
149
+ else { // IPアドレスの場合
150
+
151
+ addr = inet_addr(szHost);
152
+
153
+ hostEnt = gethostbyaddr((char*)&addr, 4, AF_INET);
154
+
155
+ }
156
+
157
+ if (hostEnt == NULL) {
158
+
159
+ printf("エラー:アドレスを解決できない [%s]\n・・・終了します\n", szHost);
160
+
161
+ WSACleanup();
162
+
163
+ return(-1);
164
+
165
+ }
166
+
167
+
168
+
169
+ // サーバ接続のための初期化
170
+
171
+ memset(&server, 0, sizeof(server));
172
+
173
+ memcpy(&(server.sin_addr), hostEnt->h_addr, hostEnt->h_length);
174
+
175
+ server.sin_family = hostEnt->h_addrtype;
176
+
177
+ server.sin_addr.s_addr = *((unsigned long*)hostEnt->h_addr); //サーバアドレス
178
+
179
+ server.sin_port = htons((unsigned short)NetPortNo); // サーバのポート番号の設定
180
+
181
+
182
+
183
+
184
+
185
+ while (1) {
186
+
187
+ FILE *infp;
188
+
189
+
190
+
191
+ char infname[50];
192
+
193
+ char outfname[50];
194
+
195
+
196
+
197
+ printf("読込むファイル名:");
198
+
199
+ scanf("%s", infname);
200
+
201
+ infp = fopen(infname, "r");
202
+
203
+ if (infp == NULL) {
204
+
205
+ printf("ファイル%sがオープンできません\n", infname);
206
+
207
+ return -1;
208
+
209
+ }
210
+
211
+ printf("書き込むファイル名:");
212
+
213
+ scanf("%s", outfname);
214
+
215
+
216
+
217
+ send(DataSocket, outfname, (int)strlen(outfname), 0); //送信(send関数)
218
+
219
+
220
+
221
+ while (1) {
222
+
223
+ if (fgets(StrBuf, 1023, infp) == NULL)
224
+
31
- ```
225
+ break;
226
+
227
+
228
+
229
+
230
+
231
+ /******** 文字列の送信 *********/
232
+
233
+ send(DataSocket, StrBuf, (int)strlen(StrBuf), 0); //送信(send関数)
234
+
235
+
236
+
237
+
238
+
239
+ // メッセージを表示す //printf("受信文字列:%s\n", StrBuf);
240
+
241
+
242
+
243
+ }
244
+
245
+ fclose(infp);
246
+
247
+ }
248
+
249
+
250
+
251
+ // ソケット終了処理
252
+
253
+ closesocket(DataSocket); //ソケットのクローズ
254
+
255
+ WSACleanup(); //ソケットの破棄
256
+
257
+
258
+
259
+ printf("\n\nEnterキーを1,2回押してプログラム終了");
260
+
261
+ getchar();
262
+
263
+ getchar();
264
+
265
+
266
+
267
+ return(0);
268
+
269
+
270
+
271
+ }
272
+
273
+
274
+
275
+ ↓サーバのソースプログラム
276
+
277
+ #include <winsock.h> //Windows用ソケットライブラリ用
278
+
279
+ #include <stdio.h>
280
+
281
+ #include <stdlib.h>
282
+
283
+ #include <string.h>
284
+
285
+ #include <ctype.h>
286
+
287
+
288
+
289
+ #pragma comment(lib,"wsock32.lib") //WinSockライブラリをリンク
290
+
291
+
292
+
293
+ #define MAX_BUFF_12A 1024 // バッファの長さ
294
+
295
+
296
+
297
+ int ServerPort = 15050; // サーバーのポート番号
298
+
299
+
300
+
301
+ //
302
+
303
+ // メイン関数
304
+
305
+ //
306
+
307
+ int main(void) {
308
+
309
+
310
+
311
+ char StrBuf[MAX_BUFF_12A + 1];
312
+
313
+ SOCKET DataSocket; //送受信用ソケット
314
+
315
+ WSADATA wsaData;
316
+
317
+ SOCKADDR_IN local; //このサーバアプリのソケット情報
318
+
319
+ WORD wVersionRequested;
320
+
321
+ int rVal;
322
+
323
+ SOCKADDR_IN from; //受信(recvfrom)の時の送信元アドレス・ポート番号情報
324
+
325
+ int fromlen = sizeof(from);
326
+
327
+
328
+
329
+
330
+
331
+ // ソケットの初期化(ウィンドウズ用Winsockの初期化)
332
+
333
+ wVersionRequested = MAKEWORD(1, 1);
334
+
335
+ rVal = WSAStartup(wVersionRequested, &wsaData); //初期化の関数
336
+
337
+ if (rVal != 0) { //初期化のエラー
338
+
339
+ printf("エラー:ソケット初期化・・・終了します\n");
340
+
341
+ WSACleanup();
342
+
343
+ return(-1);
344
+
345
+ }
346
+
347
+
348
+
349
+ printf("******UDP型サーバの起動*****\n");
350
+
351
+ printf("サーバ起動時のポート番号(1024以上):");
352
+
353
+ scanf("%d", &ServerPort);
354
+
355
+ FILE *infp;
356
+
357
+
358
+
359
+ char infname[50];
360
+
361
+ char outfname[50];
362
+
363
+
364
+
365
+ printf("読込むファイル名:");
366
+
367
+ scanf("%s", infname);
368
+
369
+ infp = fopen(infname, "r");
370
+
371
+ if (infp == NULL) {
372
+
373
+ printf("ファイル%sがオープンできません\n", infname);
374
+
375
+ return -1;
376
+
377
+ }
378
+
379
+ printf("書き込むファイル名:");
380
+
381
+ scanf("%s", outfname);
382
+
383
+
384
+
385
+ send(DataSocket, outfname, (int)strlen(outfname), 0); //送信(send関数)
386
+
387
+
388
+
389
+ while (1) {
390
+
391
+ if (fgets(StrBuf, 1023, infp) == NULL)
392
+
393
+ break;
394
+
395
+
396
+
397
+
398
+
399
+ /******** 文字列の送信 *********/
400
+
401
+ send(DataSocket, StrBuf, (int)strlen(StrBuf), 0); //送信(send関数)
402
+
403
+
404
+
405
+
406
+
407
+ // メッセージを表示する
408
+
409
+ //printf("受信文字列:%s\n", StrBuf);
410
+
411
+
412
+
413
+ }
414
+
415
+ fclose(infp);
416
+
417
+
418
+
419
+
420
+
421
+
422
+
423
+ // ソケット生成用のSOCKADDR_IN構造体の設定
424
+
425
+ memset(&local, 0, sizeof(local));
426
+
427
+ local.sin_family = AF_INET;
428
+
429
+ local.sin_addr.s_addr = htonl(INADDR_ANY);
430
+
431
+ local.sin_port = htons((unsigned short)ServerPort); //ポート番号の設定
432
+
433
+
434
+
435
+ //************************************************************
436
+
437
+ // ソケット生成(TCPソケット:DGRAM型)
438
+
439
+ //************************************************************
440
+
441
+ DataSocket = socket(AF_INET, SOCK_DGRAM, 0); //ソケット生成:DGRAM→UDP型
442
+
443
+
444
+
445
+ if (DataSocket < 0) {
446
+
447
+ printf("エラー:ソケット生成・・・終了します\n");
448
+
449
+ WSACleanup();
450
+
451
+ return(-1);
452
+
453
+ }
454
+
455
+
456
+
457
+ // 生成したソケットにバインド
458
+
459
+ if (bind(DataSocket, (LPSOCKADDR)&local, sizeof(local)) == SOCKET_ERROR) {
460
+
461
+ printf("エラー:バインドbind・・・終了します\n");
462
+
463
+ closesocket(DataSocket);
464
+
465
+ WSACleanup();
466
+
467
+ return(-1);
468
+
469
+
470
+
471
+ }
472
+
473
+
474
+
475
+ printf("ポート番号%dでbind\n", ServerPort);
476
+
477
+
478
+
479
+ while (1) {
480
+
481
+ /******** データの受信 ********/
482
+
483
+ FILE *outfp;
484
+
485
+ char outfname[50];
486
+
487
+
488
+
489
+ /******** データの受信 ********/
490
+
491
+ rVal = recv(DataSocket, outfname, sizeof(outfname), 0);
492
+
493
+ outfname[rVal] = '\0'; //受信したデータ(文字列)の最後にNULL文字付加
494
+
495
+
496
+
497
+ if (rVal == SOCKET_ERROR || rVal == 0) { //受信時エラー(または切断)
498
+
499
+ printf("エラー:相手からの切断されました\n・・・終了します\n");
500
+
501
+ closesocket(DataSocket);
502
+
503
+ WSACleanup();
504
+
505
+ return -1;
506
+
507
+ }
508
+
509
+ outfp = fopen(outfname, "w");
510
+
511
+
512
+
513
+ while (1) {
514
+
515
+ /******** データの受信 ********/
516
+
517
+
518
+
519
+ rVal = recv(DataSocket, StrBuf, sizeof(StrBuf), 0);
520
+
521
+ StrBuf[rVal] = '\0'; //受信したデータ(文字列)の最後にNULL文字付加
522
+
523
+ if (rVal == SOCKET_ERROR || rVal == 0) { //受信時エラー(または切断)
524
+
525
+ //printf("エラー:相手からの切断されました\n・・・終了します\n");
526
+
527
+ break; // ←← 問題A2以降はコメントを外す
528
+
529
+ }
530
+
531
+
532
+
533
+ fputs(StrBuf, outfp);
534
+
535
+
536
+
537
+
538
+
539
+
540
+
541
+ }
542
+
543
+ fclose(outfp);
544
+
545
+
546
+
547
+ closesocket(DataSocket); //ソケットのクローズ
548
+
549
+ WSACleanup(); //ソケットの破棄
550
+
551
+
552
+
553
+ printf("\n\nEnterキーを1,2回押してプログラム終了");
554
+
555
+ getchar(); //プログラム一時停止(キー入力待ち)
556
+
557
+ getchar(); //プログラム一時停止(キー入力待ち)
558
+
559
+
560
+
561
+ return(0);
562
+
563
+ }
564
+
565
+ }
32
566
 
33
567
 
34
568