質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2778閲覧

UDPのプログラムを正しく書きたい

mdkmdk

総合スコア11

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/07/18 13:23

編集2019/07/18 15:27

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
UDP型のクライアント側のファイルをサーバ側に転送するプログラムを作成したい

発生している問題・エラーメッセージ

出したい結果が出てこない。クライアント側が強制終了してしまう。

エラーメッセージ }が足りない ### 該当のソースコード ```C コード ```#include <winsock.h> //Windows用ソケットライブラリ用 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #pragma comment(lib,"wsock32.lib") //WinSockライブラリをリンク #define MAX_BUFF_12A 1024 // バッファの長さ int ServerPort = 15050; // サーバーのポート番号 // // メイン関数 // int main(void) { char StrBuf[MAX_BUFF_12A + 1]; SOCKET DataSocket; //送受信用ソケット WSADATA wsaData; SOCKADDR_IN local; //このサーバアプリのソケット情報 WORD wVersionRequested; int rVal; SOCKADDR_IN from; //受信(recvfrom)の時の送信元アドレス・ポート番号情報 int fromlen = sizeof(from); // ソケットの初期化(ウィンドウズ用Winsockの初期化) wVersionRequested = MAKEWORD(1, 1); rVal = WSAStartup(wVersionRequested, &wsaData); //初期化の関数 if (rVal != 0) { //初期化のエラー printf("エラー:ソケット初期化・・・終了します\n"); WSACleanup(); return(-1); } printf("******UDP型サーバの起動*****\n"); printf("サーバ起動時のポート番号(1024以上):"); scanf("%d", &ServerPort); FILE *infp; char infname[50]; char outfname[50]; printf("読込むファイル名:"); scanf("%s", infname); infp = fopen(infname, "r"); if (infp == NULL) { printf("ファイル%sがオープンできません\n", infname); return -1; } printf("書き込むファイル名:"); scanf("%s", outfname); send(DataSocket, outfname, (int)strlen(outfname), 0); //送信(send関数) while (1) { if (fgets(StrBuf, 1023, infp) == NULL) break; /******** 文字列の送信 *********/ send(DataSocket, StrBuf, (int)strlen(StrBuf), 0); //送信(send関数) // メッセージを表示する //printf("受信文字列:%s\n", StrBuf); } fclose(infp); // ソケット生成用のSOCKADDR_IN構造体の設定 memset(&local, 0, sizeof(local)); local.sin_family = AF_INET; local.sin_addr.s_addr = htonl(INADDR_ANY); local.sin_port = htons((unsigned short)ServerPort); //ポート番号の設定 //************************************************************ // ソケット生成(TCPソケット:DGRAM型) //************************************************************ DataSocket = socket(AF_INET, SOCK_DGRAM, 0); //ソケット生成:DGRAM→UDP型 if (DataSocket < 0) { printf("エラー:ソケット生成・・・終了します\n"); WSACleanup(); return(-1); } // 生成したソケットにバインド if (bind(DataSocket, (LPSOCKADDR)&local, sizeof(local)) == SOCKET_ERROR) { printf("エラー:バインドbind・・・終了します\n"); closesocket(DataSocket); WSACleanup(); return(-1); } printf("ポート番号%dでbind\n", ServerPort); while (1) { /******** データの受信 ********/ FILE *outfp; char outfname[50]; /******** データの受信 ********/ rVal = recv(DataSocket, outfname, sizeof(outfname), 0); outfname[rVal] = '\0'; //受信したデータ(文字列)の最後にNULL文字付加 if (rVal == SOCKET_ERROR || rVal == 0) { //受信時エラー(または切断) printf("エラー:相手からの切断されました\n・・・終了します\n"); closesocket(DataSocket); WSACleanup(); return -1; } outfp = fopen(outfname, "w"); while (1) { /******** データの受信 ********/ rVal = recv(DataSocket, StrBuf, sizeof(StrBuf), 0); StrBuf[rVal] = '\0'; //受信したデータ(文字列)の最後にNULL文字付加 if (rVal == SOCKET_ERROR || rVal == 0) { //受信時エラー(または切断) //printf("エラー:相手からの切断されました\n・・・終了します\n"); break; // ←← 問題A2以降はコメントを外す } fputs(StrBuf, outfp); } fclose(outfp); closesocket(DataSocket); //ソケットのクローズ WSACleanup(); //ソケットの破棄 printf("\n\nEnterキーを1,2回押してプログラム終了"); getchar(); //プログラム一時停止(キー入力待ち) getchar(); //プログラム一時停止(キー入力待ち) return(0); } }``` #include <winsock.h> //Windows用ソケットライブラリ用 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #pragma comment(lib,"wsock32.lib") //WinSockライブラリをリンク #define MAX_BUFF_12A 1024 // バッファの長さ int NetPortNo = 15050; char HostAddr[50] = "127.0.0.1"; // // メイン関数 // int main(void) { char StrBuf[MAX_BUFF_12A + 1]; SOCKET DataSocket; //送受信用ソケット WSADATA wsaData; WORD wVersionRequested; int rVal; int nEnable = 1; SOCKADDR_IN server; //サーバのアドレス・ポート番号情報 HOSTENT *hostEnt; char szHost[MAX_BUFF_12A + 1]; unsigned int addr; SOCKADDR_IN from; //受信(recvfrom)の時の送信元アドレス・ポート番号情報 int fromlen = sizeof(from); // ソケットの初期化(ウィンドウズ用Winsockの初期化) wVersionRequested = MAKEWORD(1, 1); rVal = WSAStartup(wVersionRequested, &wsaData); //初期化の関数 if (rVal != 0) { //初期化のエラー printf("エラー:ソケット初期化・・・終了します\n"); WSACleanup(); return(-1); } // ソケット生成(TCPソケット) DataSocket = socket(AF_INET, SOCK_DGRAM, 0); // ソケット生成:DGRAM→UDP型 if (DataSocket < 0) { printf("エラー:ソケット生成・・・終了します\n"); return(-1); } printf("******UDP型クライアントの起動*****\n"); printf("サーバのホスト名(またはIPアドレス:)"); scanf("%s", StrBuf[50]); // サーバ情報の取得 strcpy(szHost, HostAddr); //サーバ名(名前またはIP)をszHostへコピー if (isalpha(szHost[0])) { // 名前の場合 hostEnt = gethostbyname(szHost); //DNSへ問合せ } else { // IPアドレスの場合 addr = inet_addr(szHost); hostEnt = gethostbyaddr((char*)&addr, 4, AF_INET); } if (hostEnt == NULL) { printf("エラー:アドレスを解決できない [%s]\n・・・終了します\n", szHost); WSACleanup(); return(-1); } // サーバ接続のための初期化 memset(&server, 0, sizeof(server)); memcpy(&(server.sin_addr), hostEnt->h_addr, hostEnt->h_length); server.sin_family = hostEnt->h_addrtype; server.sin_addr.s_addr = *((unsigned long*)hostEnt->h_addr); //サーバアドレス server.sin_port = htons((unsigned short)NetPortNo); // サーバのポート番号の設定 while (1) { FILE *infp; char infname[50]; char outfname[50]; printf("読込むファイル名:"); scanf("%s", infname); infp = fopen(infname, "r"); if (infp == NULL) { printf("ファイル%sがオープンできません\n", infname); return -1; } printf("書き込むファイル名:"); scanf("%s", outfname); send(DataSocket, outfname, (int)strlen(outfname), 0); //送信(send関数) while (1) { if (fgets(StrBuf, 1023, infp) == NULL) break; /******** 文字列の送信 *********/ send(DataSocket, StrBuf, (int)strlen(StrBuf), 0); //送信(send関数) // メッセージを表示す //printf("受信文字列:%s\n", StrBuf); } fclose(infp); } // ソケット終了処理 closesocket(DataSocket); //ソケットのクローズ WSACleanup(); //ソケットの破棄 printf("\n\nEnterキーを1,2回押してプログラム終了"); getchar(); getchar(); return(0); } ``` コード

試したこと

TCPで同じようなプログラムを作成し動作したので同じように組み立てた。

補足情報(FW/ツールのバージョンなど)

大学でまだ学習途中なのですが、周りよりも理解が遅く追いつけていないです。教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/07/18 13:28

質問は編集できるので、追記修正しましょう
y_waiwai

2019/07/18 14:09

ソースコードは、質問を編集し、<code>ボタンを押して、出てきた’’’の枠の中に貼り付けてください
y_waiwai

2019/07/18 14:10

また、どこの行でどういうエラーメッセージが出たのか、そのままの形で提示してください
y_waiwai

2019/07/18 14:35

これではコードが見れません ソースコードは、質問を編集し、<code>ボタンを押して、出てきた’’’の枠の中に貼り付けてください
mdkmdk

2019/07/18 14:47

わかりました
mdkmdk

2019/07/18 14:58

言われた通りやったのですが、できてないやつですね、、
keicha_hrs

2019/07/18 15:13

```C int main(void) { } ``` のようにして、```の行でソースコードの上下を挟むようにしてください。
mdkmdk

2019/07/18 15:26

わかりました
mdkmdk

2019/07/18 16:55

訂正しました
keicha_hrs

2019/07/18 23:23

ソースコードが複数あるなら、ソースコードごとに```で挟んでください(そこまで全部説明しなければならないのか)。上側の```の末尾に言語名(今回ならC)を記述することで、その言語に向けた修飾がかかります。 ```C と記述してください。<code>ボタンを押下したときに「ここに言語を入力」と表示されるのは、CとかJavaとかいった言語名を書いてくれということを求めているのです。 また、コード修飾した範囲は左インデントがつけられます。現状でもまだ左詰めになっている箇所があって非常に見づらいです。質問を編集する画面にはプレビューを同時に閲覧できるはずです(モバイルで投稿しているわけじゃないですよね?)。プレビューを見て、ご自身で見づらいと思いませんか?修飾をかけた投稿に慣れていないのはわかりますが、プレビューを見ながら試行錯誤すればだいたいの勘所は掴めないものでしょうか。良い回答を得るには、質問する側にも「質問力」も問われます。
guest

回答1

0

ベストアンサー

エラーメッセージ

}が足りない

そのエラーメッセージのとおりだと思いますが
カッコの数が全てあっているか確認してみよう。

投稿2019/07/18 13:25

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mdkmdk

2019/07/18 13:32

かっこの数が合っているのに対応するかっこが見当たりませんでしたと出てきてしまいます。プログラムの本文がいきなり長くなりすぎて何が何だか混乱してしまいます。
y_waiwai

2019/07/18 13:57

あっていると見えているだけでは。 全角文字が入ってないかをチェックしてみよう。 #質問を編集してソースコードを追記してくださればこっちでみれますが
mdkmdk

2019/07/18 14:02

わかりました。編集してみます。丁寧にありがとうございます
y_waiwai

2019/07/18 14:35

これではコードが見れません ソースコードは、質問を編集し、<code>ボタンを押して、出てきた’’’の枠の中に貼り付けてください
y_waiwai

2019/07/18 16:00

それで、どの行でそのエラーが出てるんでしょうか
mdkmdk

2019/07/18 16:08

エラーは0です。警告が24個出てきます
y_waiwai

2019/07/18 21:04

当初のエラーは解決した、ということでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問