質問編集履歴
1
実行できていたエラーのなかったソースの追加及び条件の明示
test
CHANGED
File without changes
|
test
CHANGED
@@ -499,3 +499,163 @@
|
|
499
499
|
[root@skt35 Linux_share]# ./server
|
500
500
|
|
501
501
|
//何も表示されない
|
502
|
+
|
503
|
+
|
504
|
+
|
505
|
+
サーバー側(第一課題を実行できていたもの)
|
506
|
+
|
507
|
+
```c
|
508
|
+
|
509
|
+
void send_file(int socd) /* クライアントが要求するファイルを読み込みソケットに書き出す */
|
510
|
+
|
511
|
+
{
|
512
|
+
|
513
|
+
char filename[MAXFILENAME+1];
|
514
|
+
|
515
|
+
FILE *fd;
|
516
|
+
|
517
|
+
char ack;
|
518
|
+
|
519
|
+
char buf[MAXBUFLEN];
|
520
|
+
|
521
|
+
for(;;)
|
522
|
+
|
523
|
+
{
|
524
|
+
|
525
|
+
/* クライアントから送られるファイル名をソケットから読み込む */
|
526
|
+
|
527
|
+
recv(socd, filename, MAXFILENAME+1, 0);
|
528
|
+
|
529
|
+
/* ファイルを読み出し専用にオープンする */
|
530
|
+
|
531
|
+
if((fd = fopen(filename, "r")) != NULL) { /* ファイルオープンに成功した場合 */
|
532
|
+
|
533
|
+
/* オープン成功メッセージを送る */
|
534
|
+
|
535
|
+
ack = OK;
|
536
|
+
|
537
|
+
send(socd, &ack, 1, 0);
|
538
|
+
|
539
|
+
/* ファイルから1行読み込みソケットに書き出すことをEOFを読むまで繰り返す */
|
540
|
+
|
541
|
+
printf("ファイル %s を送信\n",filename);
|
542
|
+
|
543
|
+
while(fgets(buf, MAXBUFLEN, fd)) {
|
544
|
+
|
545
|
+
send(socd, buf, strlen(buf), 0);
|
546
|
+
|
547
|
+
}
|
548
|
+
|
549
|
+
close(fd);
|
550
|
+
|
551
|
+
printf("\n");
|
552
|
+
|
553
|
+
}
|
554
|
+
|
555
|
+
else
|
556
|
+
|
557
|
+
{ /* ファイルオープンに失敗した場合 */
|
558
|
+
|
559
|
+
/* オープン失敗メッセージを送る */
|
560
|
+
|
561
|
+
ack = ERR;
|
562
|
+
|
563
|
+
send(socd, &ack, 1, 0);
|
564
|
+
|
565
|
+
}
|
566
|
+
|
567
|
+
}
|
568
|
+
|
569
|
+
}
|
570
|
+
|
571
|
+
```
|
572
|
+
|
573
|
+
|
574
|
+
|
575
|
+
クライアント側(第一課題を実行できたもの)
|
576
|
+
|
577
|
+
```c
|
578
|
+
|
579
|
+
void receive_file(int socd) /* サーバから受け取ったファイルの内容を表示する */
|
580
|
+
|
581
|
+
{
|
582
|
+
|
583
|
+
char filename[MAXFILENAME+1];
|
584
|
+
|
585
|
+
int filename_len;
|
586
|
+
|
587
|
+
char ack;
|
588
|
+
|
589
|
+
char buf[MAXBUFLEN];
|
590
|
+
|
591
|
+
int length;
|
592
|
+
|
593
|
+
for(;;)
|
594
|
+
|
595
|
+
{
|
596
|
+
|
597
|
+
|
598
|
+
|
599
|
+
/* ファイル名の入力 */
|
600
|
+
|
601
|
+
printf("remote file name?: ");
|
602
|
+
|
603
|
+
printf("what");
|
604
|
+
|
605
|
+
if(scanf("%s",filename)==EOF)break;
|
606
|
+
|
607
|
+
printf("at");
|
608
|
+
|
609
|
+
/* ファイル名をソケットに書き込む */
|
610
|
+
|
611
|
+
filename_len = strlen(filename);
|
612
|
+
|
613
|
+
printf("that");
|
614
|
+
|
615
|
+
send(socd, filename, filename_len+1, 0);
|
616
|
+
|
617
|
+
printf("chat");
|
618
|
+
|
619
|
+
/* ファイルオープンに成功したかどうかのメッセージをソケットから読み込む */
|
620
|
+
|
621
|
+
recv(socd, &ack, 1, 0);
|
622
|
+
|
623
|
+
printf("hat");
|
624
|
+
|
625
|
+
switch (ack) {
|
626
|
+
|
627
|
+
case OK: /* ファイルオープンに成功した場合 */
|
628
|
+
|
629
|
+
printf("ファイル %s を受信\n", filename);
|
630
|
+
|
631
|
+
/* ソケットから読み込み標準出力に書き出す */
|
632
|
+
|
633
|
+
while(length = recv(socd, buf, MAXBUFLEN, 0)) {
|
634
|
+
|
635
|
+
buf[length] = '\0';
|
636
|
+
|
637
|
+
fputs(buf, stdout);
|
638
|
+
|
639
|
+
break;
|
640
|
+
|
641
|
+
}
|
642
|
+
|
643
|
+
break;
|
644
|
+
|
645
|
+
case ERR: /* ファイルオープンに失敗した場合 */
|
646
|
+
|
647
|
+
fprintf(stderr, "File access error\n");
|
648
|
+
|
649
|
+
break;
|
650
|
+
|
651
|
+
}
|
652
|
+
|
653
|
+
}
|
654
|
+
|
655
|
+
}
|
656
|
+
|
657
|
+
```
|
658
|
+
|
659
|
+
サーバー側とクライアント側ともに最後の関数しか変更しておらず、この部分のみの状態でしたら実行できました。
|
660
|
+
|
661
|
+
今回に関しては複数の入力に対して複数の出力ができればいいので。特に","で区切らないといけないという訳でもなく、複数という条件しか出されていなかったので最小二つに対応できればいいです。
|