前提・実現したいこと
ここに質問の内容を詳しく書いてください。
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/ツールのバージョンなど)
大学でまだ学習途中なのですが、周りよりも理解が遅く追いつけていないです。教えていただきたいです。
質問は編集できるので、追記修正しましょう
ソースコードは、質問を編集し、<code>ボタンを押して、出てきた’’’の枠の中に貼り付けてください
また、どこの行でどういうエラーメッセージが出たのか、そのままの形で提示してください
これではコードが見れません
ソースコードは、質問を編集し、<code>ボタンを押して、出てきた’’’の枠の中に貼り付けてください
わかりました
言われた通りやったのですが、できてないやつですね、、
```C
int main(void)
{
}
```
のようにして、```の行でソースコードの上下を挟むようにしてください。
わかりました
訂正しました
ソースコードが複数あるなら、ソースコードごとに```で挟んでください(そこまで全部説明しなければならないのか)。上側の```の末尾に言語名(今回ならC)を記述することで、その言語に向けた修飾がかかります。
```C
と記述してください。<code>ボタンを押下したときに「ここに言語を入力」と表示されるのは、CとかJavaとかいった言語名を書いてくれということを求めているのです。
また、コード修飾した範囲は左インデントがつけられます。現状でもまだ左詰めになっている箇所があって非常に見づらいです。質問を編集する画面にはプレビューを同時に閲覧できるはずです(モバイルで投稿しているわけじゃないですよね?)。プレビューを見て、ご自身で見づらいと思いませんか?修飾をかけた投稿に慣れていないのはわかりますが、プレビューを見ながら試行錯誤すればだいたいの勘所は掴めないものでしょうか。良い回答を得るには、質問する側にも「質問力」も問われます。
回答1件
あなたの回答
tips
プレビュー