解決策が見つからないため新たに質問させていただきます。申し訳ございません。
UDPを利用したソケット通信で、入力した文字列、送信された文字列をテキストに出力するプログラムを作成しております。
問題点は
・endを入力しても終わらない
・繰り返し入力をしたいのにできない
受信側は1回目の入力でrecvfrom: Bad file descriptor
送信側は2回目の入力でsendto: Bad file descriptor
が表示され強制終了されてしまいます。
C言語を数週間くらいしか触っていないほどの初心者ではありまずが、
何卒ご指摘助言よろしくお願いいたします。
コードを書き込ませていただきます。
受信プログラム
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main(int argc, char** argv)
{
int sd;
struct sockaddr_in addr;
socklen_t sin_size;
struct sockaddr_in from_addr;
char buf[2048]; // 受信バッファ
// IPv4 UDP のソケットを作成
if((sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket");
return -1;
}
// 待ち受けるIPとポート番号を設定
addr.sin_family = AF_INET;
addr.sin_port = htons(22222);
addr.sin_addr.s_addr = INADDR_ANY; // すべてのアドレス宛のパケットを受信する
// バインドする
if(bind(sd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind");
return -1;
}
while (1) {
// 受信バッファの初期化
memset(buf, 0, sizeof(buf));
// 受信 パケットが到着するまでブロック
// from_addr には、送信元アドレスが格納される
if(recvfrom(sd, buf, sizeof(buf), 0,
(struct sockaddr *)&from_addr, &sin_size) < 0) {
perror("recvfrom");
return -1;
}
// ソケットのクローズ
close(sd);
// 受信データの出力
printf("%s\n", buf);
FILE *fp; //ファイルポインター
fp = fopen("test2.dat","a"); //ファイルを開く
//ファイルに書きこむ
fprintf(fp,"%s\n",buf); //区切り文字:スペース
//画面に出力
//printf("%s\n",buf);
fclose(fp); //ファイルを閉じる
if (!strncmp(buf, "end", 3)) break;}
return 0;
}
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
char message[256];
int main(int argc, char** argv)
{
int sd;
struct sockaddr_in addr;
if((sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket");
return -1;
}
// 送信先アドレスとポート番号を設定する
// 受信プログラムと異なるあて先を設定しても UDP の場合はエラーにはならない
addr.sin_family = AF_INET;
addr.sin_port = htons(22222);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
while (1) {
printf(">>message\n");
fgets(message, sizeof(message), stdin);
// パケットをUDPで送信
if(sendto(sd, message, 256, 0,
(struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("sendto");
return -1;
}
FILE *fp; //ファイルポインター
fp = fopen("test.dat","a"); //ファイルを開く
//ファイルに書きこむ
fprintf(fp,"%s\n",message); //区切り文字:スペース
//画面に出力
//printf("%s\n",message);
fclose(fp); //ファイルを閉じる
close(sd);
if (!strncmp(message, "end", 3)) break;}
return 0;
}