teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

5

ソースプログラムの訂正

2019/07/18 15:27

投稿

mdkmdk
mdkmdk

スコア11

title CHANGED
File without changes
body CHANGED
@@ -11,9 +11,9 @@
11
11
 
12
12
  ### 該当のソースコード
13
13
 
14
- C言語(C++)
14
+ ```C
15
- ソースコード```
15
+ コード
16
- ```>#include <winsock.h> //Windows用ソケットライブラリ用
16
+ ```#include <winsock.h> //Windows用ソケットライブラリ用
17
17
  #include <stdio.h>
18
18
  #include <stdlib.h>
19
19
  #include <string.h>
@@ -279,15 +279,9 @@
279
279
 
280
280
  return(0);
281
281
 
282
- } ここに言語を入力
282
+ } ```
283
283
  コード
284
284
  ```
285
- コード
286
- ```
287
- コード
288
- ```
289
- コード
290
- ```
291
285
  ### 試したこと
292
286
 
293
287
  TCPで同じようなプログラムを作成し動作したので同じように組み立てた。

4

ソースプログラムの訂正

2019/07/18 15:27

投稿

mdkmdk
mdkmdk

スコア11

title CHANGED
File without changes
body CHANGED
@@ -12,8 +12,8 @@
12
12
  ### 該当のソースコード
13
13
 
14
14
  C言語(C++)
15
- ソースコード
15
+ ソースコード```
16
- ```#include <winsock.h> //Windows用ソケットライブラリ用
16
+ ```>#include <winsock.h> //Windows用ソケットライブラリ用
17
17
  #include <stdio.h>
18
18
  #include <stdlib.h>
19
19
  #include <string.h>
@@ -279,12 +279,15 @@
279
279
 
280
280
  return(0);
281
281
 
282
- }
283
- //エラーは0で警告が24と出ています
282
+ } ここに言語を入力
284
283
  コード
285
284
  ```
286
285
  コード
287
286
  ```
287
+ コード
288
+ ```
289
+ コード
290
+ ```
288
291
  ### 試したこと
289
292
 
290
293
  TCPで同じようなプログラムを作成し動作したので同じように組み立てた。

3

警告の追加

2019/07/18 15:01

投稿

mdkmdk
mdkmdk

スコア11

title CHANGED
File without changes
body CHANGED
@@ -280,6 +280,7 @@
280
280
  return(0);
281
281
 
282
282
  }
283
+ //エラーは0で警告が24と出ています
283
284
  コード
284
285
  ```
285
286
  コード

2

ソースプログラムの追加

2019/07/18 14:17

投稿

mdkmdk
mdkmdk

スコア11

title CHANGED
File without changes
body CHANGED
@@ -13,8 +13,7 @@
13
13
 
14
14
  C言語(C++)
15
15
  ソースコード
16
- ↓クライアントのソースプログラム
17
- #include <winsock.h> //Windows用ソケットライブラリ用
16
+ ```#include <winsock.h> //Windows用ソケットライブラリ用
18
17
  #include <stdio.h>
19
18
  #include <stdlib.h>
20
19
  #include <string.h>
@@ -24,128 +23,6 @@
24
23
 
25
24
  #define MAX_BUFF_12A 1024 // バッファの長さ
26
25
 
27
- int NetPortNo = 15050;
28
- char HostAddr[50] = "127.0.0.1";
29
-
30
- //
31
- // メイン関数
32
- //
33
- int main(void)
34
- {
35
- char StrBuf[MAX_BUFF_12A + 1];
36
- SOCKET DataSocket; //送受信用ソケット
37
- WSADATA wsaData;
38
- WORD wVersionRequested;
39
- int rVal;
40
- int nEnable = 1;
41
- SOCKADDR_IN server; //サーバのアドレス・ポート番号情報
42
- HOSTENT *hostEnt;
43
- char szHost[MAX_BUFF_12A + 1];
44
- unsigned int addr;
45
- SOCKADDR_IN from; //受信(recvfrom)の時の送信元アドレス・ポート番号情報
46
- int fromlen = sizeof(from);
47
-
48
-
49
- // ソケットの初期化(ウィンドウズ用Winsockの初期化)
50
- wVersionRequested = MAKEWORD(1, 1);
51
- rVal = WSAStartup(wVersionRequested, &wsaData); //初期化の関数
52
- if (rVal != 0) { //初期化のエラー
53
- printf("エラー:ソケット初期化・・・終了します\n");
54
- WSACleanup();
55
- return(-1);
56
- }
57
-
58
- // ソケット生成(TCPソケット)
59
- DataSocket = socket(AF_INET, SOCK_DGRAM, 0); // ソケット生成:DGRAM→UDP型
60
- if (DataSocket < 0) {
61
- printf("エラー:ソケット生成・・・終了します\n"); return(-1);
62
- }
63
-
64
- printf("******UDP型クライアントの起動*****\n");
65
-
66
- printf("サーバのホスト名(またはIPアドレス:)");
67
- scanf("%s", StrBuf[50]);
68
-
69
-
70
- // サーバ情報の取得
71
- strcpy(szHost, HostAddr); //サーバ名(名前またはIP)をszHostへコピー
72
- if (isalpha(szHost[0])) { // 名前の場合
73
- hostEnt = gethostbyname(szHost); //DNSへ問合せ
74
- }
75
- else { // IPアドレスの場合
76
- addr = inet_addr(szHost);
77
- hostEnt = gethostbyaddr((char*)&addr, 4, AF_INET);
78
- }
79
- if (hostEnt == NULL) {
80
- printf("エラー:アドレスを解決できない [%s]\n・・・終了します\n", szHost);
81
- WSACleanup();
82
- return(-1);
83
- }
84
-
85
- // サーバ接続のための初期化
86
- memset(&server, 0, sizeof(server));
87
- memcpy(&(server.sin_addr), hostEnt->h_addr, hostEnt->h_length);
88
- server.sin_family = hostEnt->h_addrtype;
89
- server.sin_addr.s_addr = *((unsigned long*)hostEnt->h_addr); //サーバアドレス
90
- server.sin_port = htons((unsigned short)NetPortNo); // サーバのポート番号の設定
91
-
92
-
93
- while (1) {
94
- FILE *infp;
95
-
96
- char infname[50];
97
- char outfname[50];
98
-
99
- printf("読込むファイル名:");
100
- scanf("%s", infname);
101
- infp = fopen(infname, "r");
102
- if (infp == NULL) {
103
- printf("ファイル%sがオープンできません\n", infname);
104
- return -1;
105
- }
106
- printf("書き込むファイル名:");
107
- scanf("%s", outfname);
108
-
109
- send(DataSocket, outfname, (int)strlen(outfname), 0); //送信(send関数)
110
-
111
- while (1) {
112
- if (fgets(StrBuf, 1023, infp) == NULL)
113
- break;
114
-
115
-
116
- /******** 文字列の送信 *********/
117
- send(DataSocket, StrBuf, (int)strlen(StrBuf), 0); //送信(send関数)
118
-
119
-
120
- // メッセージを表示す //printf("受信文字列:%s\n", StrBuf);
121
-
122
- }
123
- fclose(infp);
124
- }
125
-
126
- // ソケット終了処理
127
- closesocket(DataSocket); //ソケットのクローズ
128
- WSACleanup(); //ソケットの破棄
129
-
130
- printf("\n\nEnterキーを1,2回押してプログラム終了");
131
- getchar();
132
- getchar();
133
-
134
- return(0);
135
-
136
- }
137
-
138
- ↓サーバのソースプログラム
139
- #include <winsock.h> //Windows用ソケットライブラリ用
140
- #include <stdio.h>
141
- #include <stdlib.h>
142
- #include <string.h>
143
- #include <ctype.h>
144
-
145
- #pragma comment(lib,"wsock32.lib") //WinSockライブラリをリンク
146
-
147
- #define MAX_BUFF_12A 1024 // バッファの長さ
148
-
149
26
  int ServerPort = 15050; // サーバーのポート番号
150
27
 
151
28
  //
@@ -208,7 +85,6 @@
208
85
  fclose(infp);
209
86
 
210
87
 
211
-
212
88
  // ソケット生成用のSOCKADDR_IN構造体の設定
213
89
  memset(&local, 0, sizeof(local));
214
90
  local.sin_family = AF_INET;
@@ -280,8 +156,134 @@
280
156
 
281
157
  return(0);
282
158
  }
159
+ }```
160
+ #include <winsock.h> //Windows用ソケットライブラリ用
161
+ #include <stdio.h>
162
+ #include <stdlib.h>
163
+ #include <string.h>
164
+ #include <ctype.h>
165
+
166
+ #pragma comment(lib,"wsock32.lib") //WinSockライブラリをリンク
167
+
168
+ #define MAX_BUFF_12A 1024 // バッファの長さ
169
+
170
+ int NetPortNo = 15050;
171
+ char HostAddr[50] = "127.0.0.1";
172
+
173
+ //
174
+ // メイン関数
175
+ //
176
+ int main(void)
177
+ {
178
+ char StrBuf[MAX_BUFF_12A + 1];
179
+ SOCKET DataSocket; //送受信用ソケット
180
+ WSADATA wsaData;
181
+ WORD wVersionRequested;
182
+ int rVal;
183
+ int nEnable = 1;
184
+ SOCKADDR_IN server; //サーバのアドレス・ポート番号情報
185
+ HOSTENT *hostEnt;
186
+ char szHost[MAX_BUFF_12A + 1];
187
+ unsigned int addr;
188
+ SOCKADDR_IN from; //受信(recvfrom)の時の送信元アドレス・ポート番号情報
189
+ int fromlen = sizeof(from);
190
+
191
+
192
+ // ソケットの初期化(ウィンドウズ用Winsockの初期化)
193
+ wVersionRequested = MAKEWORD(1, 1);
194
+ rVal = WSAStartup(wVersionRequested, &wsaData); //初期化の関数
195
+ if (rVal != 0) { //初期化のエラー
196
+ printf("エラー:ソケット初期化・・・終了します\n");
197
+ WSACleanup();
198
+ return(-1);
199
+ }
200
+
201
+ // ソケット生成(TCPソケット)
202
+ DataSocket = socket(AF_INET, SOCK_DGRAM, 0); // ソケット生成:DGRAM→UDP型
203
+ if (DataSocket < 0) {
204
+ printf("エラー:ソケット生成・・・終了します\n"); return(-1);
205
+ }
206
+
207
+ printf("******UDP型クライアントの起動*****\n");
208
+
209
+ printf("サーバのホスト名(またはIPアドレス:)");
210
+ scanf("%s", StrBuf[50]);
211
+
212
+
213
+
214
+ // サーバ情報の取得
215
+ strcpy(szHost, HostAddr); //サーバ名(名前またはIP)をszHostへコピー
216
+ if (isalpha(szHost[0])) { // 名前の場合
217
+ hostEnt = gethostbyname(szHost); //DNSへ問合せ
218
+ }
219
+ else { // IPアドレスの場合
220
+ addr = inet_addr(szHost);
221
+ hostEnt = gethostbyaddr((char*)&addr, 4, AF_INET);
222
+ }
223
+ if (hostEnt == NULL) {
224
+ printf("エラー:アドレスを解決できない [%s]\n・・・終了します\n", szHost);
225
+ WSACleanup();
226
+ return(-1);
227
+ }
228
+
229
+ // サーバ接続のための初期化
230
+ memset(&server, 0, sizeof(server));
231
+ memcpy(&(server.sin_addr), hostEnt->h_addr, hostEnt->h_length);
232
+ server.sin_family = hostEnt->h_addrtype;
233
+ server.sin_addr.s_addr = *((unsigned long*)hostEnt->h_addr); //サーバアドレス
234
+ server.sin_port = htons((unsigned short)NetPortNo); // サーバのポート番号の設定
235
+
236
+
237
+
238
+ while (1) {
239
+ FILE *infp;
240
+
241
+ char infname[50];
242
+ char outfname[50];
243
+
244
+ printf("読込むファイル名:");
245
+ scanf("%s", infname);
246
+ infp = fopen(infname, "r");
247
+ if (infp == NULL) {
248
+ printf("ファイル%sがオープンできません\n", infname);
249
+ return -1;
250
+ }
251
+ printf("書き込むファイル名:");
252
+ scanf("%s", outfname);
253
+
254
+ send(DataSocket, outfname, (int)strlen(outfname), 0); //送信(send関数)
255
+
256
+ while (1) {
257
+ if (fgets(StrBuf, 1023, infp) == NULL)
258
+ break;
259
+
260
+
261
+ /******** 文字列の送信 *********/
262
+ send(DataSocket, StrBuf, (int)strlen(StrBuf), 0); //送信(send関数)
263
+
264
+
265
+ // メッセージを表示す //printf("受信文字列:%s\n", StrBuf);
266
+
267
+ }
268
+ fclose(infp);
269
+ }
270
+
271
+
272
+ // ソケット終了処理
273
+ closesocket(DataSocket); //ソケットのクローズ
274
+ WSACleanup(); //ソケットの破棄
275
+
276
+ printf("\n\nEnterキーを1,2回押してプログラム終了");
277
+ getchar();
278
+ getchar();
279
+
280
+ return(0);
281
+
283
282
  }
284
-
283
+ コード
284
+ ```
285
+ コード
286
+ ```
285
287
  ### 試したこと
286
288
 
287
289
  TCPで同じようなプログラムを作成し動作したので同じように組み立てた。

1

ソースプログラムの追加

2019/07/18 14:14

投稿

mdkmdk
mdkmdk

スコア11

title CHANGED
@@ -1,1 +1,1 @@
1
- UDPのプログラムちんと組み立てられません
1
+ UDPのプログラムを正しく書たい
body CHANGED
@@ -13,8 +13,275 @@
13
13
 
14
14
  C言語(C++)
15
15
  ソースコード
16
- ```
16
+ ↓クライアントのソースプログラム
17
+ #include <winsock.h> //Windows用ソケットライブラリ用
18
+ #include <stdio.h>
19
+ #include <stdlib.h>
20
+ #include <string.h>
21
+ #include <ctype.h>
17
22
 
23
+ #pragma comment(lib,"wsock32.lib") //WinSockライブラリをリンク
24
+
25
+ #define MAX_BUFF_12A 1024 // バッファの長さ
26
+
27
+ int NetPortNo = 15050;
28
+ char HostAddr[50] = "127.0.0.1";
29
+
30
+ //
31
+ // メイン関数
32
+ //
33
+ int main(void)
34
+ {
35
+ char StrBuf[MAX_BUFF_12A + 1];
36
+ SOCKET DataSocket; //送受信用ソケット
37
+ WSADATA wsaData;
38
+ WORD wVersionRequested;
39
+ int rVal;
40
+ int nEnable = 1;
41
+ SOCKADDR_IN server; //サーバのアドレス・ポート番号情報
42
+ HOSTENT *hostEnt;
43
+ char szHost[MAX_BUFF_12A + 1];
44
+ unsigned int addr;
45
+ SOCKADDR_IN from; //受信(recvfrom)の時の送信元アドレス・ポート番号情報
46
+ int fromlen = sizeof(from);
47
+
48
+
49
+ // ソケットの初期化(ウィンドウズ用Winsockの初期化)
50
+ wVersionRequested = MAKEWORD(1, 1);
51
+ rVal = WSAStartup(wVersionRequested, &wsaData); //初期化の関数
52
+ if (rVal != 0) { //初期化のエラー
53
+ printf("エラー:ソケット初期化・・・終了します\n");
54
+ WSACleanup();
55
+ return(-1);
56
+ }
57
+
58
+ // ソケット生成(TCPソケット)
59
+ DataSocket = socket(AF_INET, SOCK_DGRAM, 0); // ソケット生成:DGRAM→UDP型
60
+ if (DataSocket < 0) {
61
+ printf("エラー:ソケット生成・・・終了します\n"); return(-1);
62
+ }
63
+
64
+ printf("******UDP型クライアントの起動*****\n");
65
+
66
+ printf("サーバのホスト名(またはIPアドレス:)");
67
+ scanf("%s", StrBuf[50]);
68
+
69
+
70
+ // サーバ情報の取得
71
+ strcpy(szHost, HostAddr); //サーバ名(名前またはIP)をszHostへコピー
72
+ if (isalpha(szHost[0])) { // 名前の場合
73
+ hostEnt = gethostbyname(szHost); //DNSへ問合せ
74
+ }
75
+ else { // IPアドレスの場合
76
+ addr = inet_addr(szHost);
77
+ hostEnt = gethostbyaddr((char*)&addr, 4, AF_INET);
78
+ }
79
+ if (hostEnt == NULL) {
80
+ printf("エラー:アドレスを解決できない [%s]\n・・・終了します\n", szHost);
81
+ WSACleanup();
82
+ return(-1);
83
+ }
84
+
85
+ // サーバ接続のための初期化
86
+ memset(&server, 0, sizeof(server));
87
+ memcpy(&(server.sin_addr), hostEnt->h_addr, hostEnt->h_length);
88
+ server.sin_family = hostEnt->h_addrtype;
89
+ server.sin_addr.s_addr = *((unsigned long*)hostEnt->h_addr); //サーバアドレス
90
+ server.sin_port = htons((unsigned short)NetPortNo); // サーバのポート番号の設定
91
+
92
+
93
+ while (1) {
94
+ FILE *infp;
95
+
96
+ char infname[50];
97
+ char outfname[50];
98
+
99
+ printf("読込むファイル名:");
100
+ scanf("%s", infname);
101
+ infp = fopen(infname, "r");
102
+ if (infp == NULL) {
103
+ printf("ファイル%sがオープンできません\n", infname);
104
+ return -1;
105
+ }
106
+ printf("書き込むファイル名:");
107
+ scanf("%s", outfname);
108
+
109
+ send(DataSocket, outfname, (int)strlen(outfname), 0); //送信(send関数)
110
+
111
+ while (1) {
112
+ if (fgets(StrBuf, 1023, infp) == NULL)
113
+ break;
114
+
115
+
116
+ /******** 文字列の送信 *********/
117
+ send(DataSocket, StrBuf, (int)strlen(StrBuf), 0); //送信(send関数)
118
+
119
+
120
+ // メッセージを表示す //printf("受信文字列:%s\n", StrBuf);
121
+
122
+ }
123
+ fclose(infp);
124
+ }
125
+
126
+ // ソケット終了処理
127
+ closesocket(DataSocket); //ソケットのクローズ
128
+ WSACleanup(); //ソケットの破棄
129
+
130
+ printf("\n\nEnterキーを1,2回押してプログラム終了");
131
+ getchar();
132
+ getchar();
133
+
134
+ return(0);
135
+
136
+ }
137
+
138
+ ↓サーバのソースプログラム
139
+ #include <winsock.h> //Windows用ソケットライブラリ用
140
+ #include <stdio.h>
141
+ #include <stdlib.h>
142
+ #include <string.h>
143
+ #include <ctype.h>
144
+
145
+ #pragma comment(lib,"wsock32.lib") //WinSockライブラリをリンク
146
+
147
+ #define MAX_BUFF_12A 1024 // バッファの長さ
148
+
149
+ int ServerPort = 15050; // サーバーのポート番号
150
+
151
+ //
152
+ // メイン関数
153
+ //
154
+ int main(void) {
155
+
156
+ char StrBuf[MAX_BUFF_12A + 1];
157
+ SOCKET DataSocket; //送受信用ソケット
158
+ WSADATA wsaData;
159
+ SOCKADDR_IN local; //このサーバアプリのソケット情報
160
+ WORD wVersionRequested;
161
+ int rVal;
162
+ SOCKADDR_IN from; //受信(recvfrom)の時の送信元アドレス・ポート番号情報
163
+ int fromlen = sizeof(from);
164
+
165
+
166
+ // ソケットの初期化(ウィンドウズ用Winsockの初期化)
167
+ wVersionRequested = MAKEWORD(1, 1);
168
+ rVal = WSAStartup(wVersionRequested, &wsaData); //初期化の関数
169
+ if (rVal != 0) { //初期化のエラー
170
+ printf("エラー:ソケット初期化・・・終了します\n");
171
+ WSACleanup();
172
+ return(-1);
173
+ }
174
+
175
+ printf("******UDP型サーバの起動*****\n");
176
+ printf("サーバ起動時のポート番号(1024以上):");
177
+ scanf("%d", &ServerPort);
178
+ FILE *infp;
179
+
180
+ char infname[50];
181
+ char outfname[50];
182
+
183
+ printf("読込むファイル名:");
184
+ scanf("%s", infname);
185
+ infp = fopen(infname, "r");
186
+ if (infp == NULL) {
187
+ printf("ファイル%sがオープンできません\n", infname);
188
+ return -1;
189
+ }
190
+ printf("書き込むファイル名:");
191
+ scanf("%s", outfname);
192
+
193
+ send(DataSocket, outfname, (int)strlen(outfname), 0); //送信(send関数)
194
+
195
+ while (1) {
196
+ if (fgets(StrBuf, 1023, infp) == NULL)
197
+ break;
198
+
199
+
200
+ /******** 文字列の送信 *********/
201
+ send(DataSocket, StrBuf, (int)strlen(StrBuf), 0); //送信(send関数)
202
+
203
+
204
+ // メッセージを表示する
205
+ //printf("受信文字列:%s\n", StrBuf);
206
+
207
+ }
208
+ fclose(infp);
209
+
210
+
211
+
212
+ // ソケット生成用のSOCKADDR_IN構造体の設定
213
+ memset(&local, 0, sizeof(local));
214
+ local.sin_family = AF_INET;
215
+ local.sin_addr.s_addr = htonl(INADDR_ANY);
216
+ local.sin_port = htons((unsigned short)ServerPort); //ポート番号の設定
217
+
218
+ //************************************************************
219
+ // ソケット生成(TCPソケット:DGRAM型)
220
+ //************************************************************
221
+ DataSocket = socket(AF_INET, SOCK_DGRAM, 0); //ソケット生成:DGRAM→UDP型
222
+
223
+ if (DataSocket < 0) {
224
+ printf("エラー:ソケット生成・・・終了します\n");
225
+ WSACleanup();
226
+ return(-1);
227
+ }
228
+
229
+ // 生成したソケットにバインド
230
+ if (bind(DataSocket, (LPSOCKADDR)&local, sizeof(local)) == SOCKET_ERROR) {
231
+ printf("エラー:バインドbind・・・終了します\n");
232
+ closesocket(DataSocket);
233
+ WSACleanup();
234
+ return(-1);
235
+
236
+ }
237
+
238
+ printf("ポート番号%dでbind\n", ServerPort);
239
+
240
+ while (1) {
241
+ /******** データの受信 ********/
242
+ FILE *outfp;
243
+ char outfname[50];
244
+
245
+ /******** データの受信 ********/
246
+ rVal = recv(DataSocket, outfname, sizeof(outfname), 0);
247
+ outfname[rVal] = '\0'; //受信したデータ(文字列)の最後にNULL文字付加
248
+
249
+ if (rVal == SOCKET_ERROR || rVal == 0) { //受信時エラー(または切断)
250
+ printf("エラー:相手からの切断されました\n・・・終了します\n");
251
+ closesocket(DataSocket);
252
+ WSACleanup();
253
+ return -1;
254
+ }
255
+ outfp = fopen(outfname, "w");
256
+
257
+ while (1) {
258
+ /******** データの受信 ********/
259
+
260
+ rVal = recv(DataSocket, StrBuf, sizeof(StrBuf), 0);
261
+ StrBuf[rVal] = '\0'; //受信したデータ(文字列)の最後にNULL文字付加
262
+ if (rVal == SOCKET_ERROR || rVal == 0) { //受信時エラー(または切断)
263
+ //printf("エラー:相手からの切断されました\n・・・終了します\n");
264
+ break; // ←← 問題A2以降はコメントを外す
265
+ }
266
+
267
+ fputs(StrBuf, outfp);
268
+
269
+
270
+
271
+ }
272
+ fclose(outfp);
273
+
274
+ closesocket(DataSocket); //ソケットのクローズ
275
+ WSACleanup(); //ソケットの破棄
276
+
277
+ printf("\n\nEnterキーを1,2回押してプログラム終了");
278
+ getchar(); //プログラム一時停止(キー入力待ち)
279
+ getchar(); //プログラム一時停止(キー入力待ち)
280
+
281
+ return(0);
282
+ }
283
+ }
284
+
18
285
  ### 試したこと
19
286
 
20
287
  TCPで同じようなプログラムを作成し動作したので同じように組み立てた。