質問編集履歴

1

クライアント側のソースコードも追加しました。

2019/05/17 10:51

投稿

mercury
mercury

スコア11

test CHANGED
File without changes
test CHANGED
@@ -207,3 +207,235 @@
207
207
 
208
208
 
209
209
  ```
210
+
211
+
212
+
213
+
214
+
215
+ ```
216
+
217
+ #include <winsock.h> //Windows用ソケットライブラリ用
218
+
219
+ #include <stdio.h>
220
+
221
+ #include <stdlib.h>
222
+
223
+ #include <string.h>
224
+
225
+ #include <ctype.h>
226
+
227
+
228
+
229
+ #pragma comment(lib,"wsock32.lib") //WinSockライブラリをリンク
230
+
231
+
232
+
233
+ #define MAX_BUFF_12A 1024 // バッファの長さ
234
+
235
+
236
+
237
+ int NetPortNo = 10010;
238
+
239
+ char HostAddr[50] = "127.0.0.1";
240
+
241
+
242
+
243
+ //
244
+
245
+ // main
246
+
247
+ //
248
+
249
+ int main( void )
250
+
251
+ {
252
+
253
+ char StrBuf[MAX_BUFF_12A+1] ;
254
+
255
+ char szHost[MAX_BUFF_12A+1];
256
+
257
+ SOCKET DataSocket;
258
+
259
+ WSADATA wsaData;
260
+
261
+ SOCKADDR_IN server;
262
+
263
+ HOSTENT *hostEnt;
264
+
265
+ int rVal;
266
+
267
+ WORD wVersionRequested;
268
+
269
+ unsigned int addr;
270
+
271
+
272
+
273
+ // ソケットの初期化(ウィンドウズ用Winsockの初期化)
274
+
275
+ wVersionRequested = MAKEWORD( 1, 1 );
276
+
277
+ rVal = WSAStartup( wVersionRequested, &wsaData ); //初期化の関数
278
+
279
+ if(rVal != 0 ) { //初期化のエラー
280
+
281
+ printf("エラー:ソケット初期化・・・終了します\n");
282
+
283
+ WSACleanup();
284
+
285
+ return(-1);
286
+
287
+ }
288
+
289
+
290
+
291
+ // ソケット生成(TCPソケット)
292
+
293
+ DataSocket = socket( AF_INET, SOCK_STREAM, 0 ) ; // ソケット生成の関数
294
+
295
+
296
+
297
+ if( DataSocket < 0 ) { printf("エラー:ソケット生成・・・終了します\n"); return(-1);}
298
+
299
+
300
+
301
+
302
+
303
+ printf("サーバのホスト名(またはIPアドレス):"); scanf("%s",HostAddr);
304
+
305
+ printf("サーバのポート番号:"); scanf("%d",&NetPortNo);
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+ strcpy( szHost, HostAddr );
314
+
315
+ if( isalpha( szHost[0] ) ) {
316
+
317
+ hostEnt = gethostbyname( szHost );
318
+
319
+ }
320
+
321
+ else {
322
+
323
+ addr = inet_addr( szHost );
324
+
325
+ hostEnt = gethostbyaddr( (char*)&addr, 4, AF_INET );
326
+
327
+ }
328
+
329
+ if( hostEnt == NULL ) { printf("エラー:アドレスを解決不能[%s]\n・・終了!\n", szHost);return(-1); }
330
+
331
+
332
+
333
+ printf("******クライアントの起動*****\n");
334
+
335
+ // サーバ接続のための初期化
336
+
337
+ memset( &server, 0, sizeof(server) );
338
+
339
+ memcpy( &(server.sin_addr), hostEnt->h_addr, hostEnt->h_length );
340
+
341
+
342
+
343
+ server.sin_family = hostEnt->h_addrtype;
344
+
345
+ server.sin_addr.s_addr = *(( unsigned long*)hostEnt->h_addr ); //サーバアドレス
346
+
347
+
348
+
349
+ server.sin_port = htons( (unsigned short)NetPortNo ); // サーバのポート番号の設定 <---------- ポート!
350
+
351
+
352
+
353
+ // サーバへ接続を試みる(connect関数)
354
+
355
+ printf("サーバ[%s]へ接続中...", szHost ) ;
356
+
357
+ if( connect( DataSocket,(struct sockaddr*)&server, sizeof(server) )
358
+
359
+ == SOCKET_ERROR) {
360
+
361
+ printf("エラー:サーバへの接続(connect)\n・・・終了します\n"); return(-1); }
362
+
363
+
364
+
365
+ printf("%sに接続完了しました\n", szHost );
366
+
367
+
368
+
369
+
370
+
371
+
372
+
373
+ /******** 文字列のキーボードからの読込み *********/
374
+
375
+ while (1) {
376
+
377
+ printf("文字列を入力:");
378
+
379
+ scanf("%s", StrBuf);
380
+
381
+ getchar();
382
+
383
+
384
+
385
+ /******** 文字列の送信 *********/
386
+
387
+ send(DataSocket, StrBuf, (int)strlen(StrBuf), 0); //送信(send関数)
388
+
389
+ if (StrBuf[0] == '.')
390
+
391
+ break;
392
+
393
+ /******** データの受信 ********/
394
+
395
+ rVal = recv(DataSocket, StrBuf, sizeof(StrBuf), 0); //受信(recv関数)
396
+
397
+ StrBuf[rVal] = '\0'; //受信したデータ(文字列)の最後にNULL文字付加
398
+
399
+
400
+
401
+ if (rVal == SOCKET_ERROR || rVal == 0) { //受信時エラー(または切断)
402
+
403
+ printf("エラー:相手からの切断されました\n・・・終了します\n");
404
+
405
+ break;
406
+
407
+ }
408
+
409
+
410
+
411
+
412
+
413
+ printf("受信文字列:%s\n", StrBuf);
414
+
415
+ }
416
+
417
+
418
+
419
+
420
+
421
+ // ソケット終了処理
422
+
423
+ closesocket( DataSocket ); //ソケットのクローズ
424
+
425
+ WSACleanup(); //ソケットの破棄
426
+
427
+
428
+
429
+ printf("\n\nEnterキーを1,2回押してプログラム終了");
430
+
431
+ getchar();
432
+
433
+ getchar();
434
+
435
+
436
+
437
+ return(0);
438
+
439
+ }
440
+
441
+ ```