TCPにおいてエラー10038が発生してしまう。
-
- 記事: 181
- 登録日時: 13年前
Re: TCPにおいてエラー10038が発生してしまう。
sendするときに
どんなときでも1024B
送信してしまう問題を解決し忘れていました。
これを解決したら直りました。
あと分割対応recv関数を
作っているのですが、
0になるまでループを続けるということは
sendも繰り返さなくてはならないのですか。
どんなときでも1024B
送信してしまう問題を解決し忘れていました。
これを解決したら直りました。
あと分割対応recv関数を
作っているのですが、
0になるまでループを続けるということは
sendも繰り返さなくてはならないのですか。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: TCPにおいてエラー10038が発生してしまう。
なんとなく治ったでは理解になりませんので元に戻してオーバーしている事実を確認したほうが良いです。helloworld1853 さんが書きました:sendするときに
どんなときでも1024B
送信してしまう問題を解決し忘れていました。
これを解決したら直りました。
デバッグは
1)実際の問題点の確認。
2)推測される問題点を修正。
3)治ったことを確認
でちゃんとしたデバッグの完了です。
1)などを手を抜くとろくな事はありません。
分割は、パソコンのOSやスイッチングハブ、ルータ、モデム、インテーネット経路などの都合で起こりますので送信する側は気にしなくて良いです。helloworld1853 さんが書きました: あと分割対応recv関数を
作っているのですが、
0になるまでループを続けるということは
sendも繰り返さなくてはならないのですか。
逆に言えば分割したくなくても分割されます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 181
- 登録日時: 13年前
Re: TCPにおいてエラー10038が発生してしまう。
1)実際の問題点の確認。
データの大きさが1024だと
メモリ違反を起こしてしまう
原因char output[1024];は
output[0]からoutput[1023]
までしかない。
そこに
output[1024] = '\0';
と代入するとメモリ違反が起きる。
2)推測される問題点を修正。
scanf_sのあとに
strlenでサイズ特定
し、send関数に渡す
1024を越えることがなくなる
3)治ったことを確認
確認しました。
送られてきたデータが
分割されたデータの一部なのか、
それで全部のデータなのか判断する方法はありますか。
データの大きさが1024だと
メモリ違反を起こしてしまう
原因char output[1024];は
output[0]からoutput[1023]
までしかない。
そこに
output[1024] = '\0';
と代入するとメモリ違反が起きる。
2)推測される問題点を修正。
scanf_sのあとに
strlenでサイズ特定
し、send関数に渡す
1024を越えることがなくなる
3)治ったことを確認
確認しました。
送られてきたデータが
分割されたデータの一部なのか、
それで全部のデータなのか判断する方法はありますか。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: TCPにおいてエラー10038が発生してしまう。
helloworld1853 さんが書きました:1)実際の問題点の確認。
データの大きさが1024だと
メモリ違反を起こしてしまう
原因char output[1024];は
output[0]からoutput[1023]
までしかない。
そこに
output[1024] = '\0';
と代入するとメモリ違反が起きる。
2)推測される問題点を修正。
scanf_sのあとに
strlenでサイズ特定
し、send関数に渡す
1024を越えることがなくなる
3)治ったことを確認
確認しました。
デバッグとは、そういう事です。基本的に怪しい所を闇雲に修正はせず。
間違っていることを確認してから修正して下さい。そうすれば後から変なバグに悩まされずに済みます。
無いので通常は送信データ先頭に送信データサイズのデータを付与します。helloworld1853 さんが書きました: 送られてきたデータが
分割されたデータの一部なのか、
それで全部のデータなのか判断する方法はありますか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 181
- 登録日時: 13年前
Re: TCPにおいてエラー10038が発生してしまう。
http://s1.etowns.server-on.net/~yamada_ ... client.cpp
新しく関数を追加しました。
took_size関数は
先頭にあるサイズデータを
習得します。
先頭には
"0000012345"
というように10進数で
10文字数字が入っています。
これを数値に変えるのが
took_size関数です。
正直自信がないので見ていただきたいです。
あと未完成ながらも
my_recv関数も追加しました。
引数はrecv関数と同じで、
分割されたデータに対応できます。
こちらも見ていただけると幸いです。
ソースコードが汚いですが、
よろしくお願いします。
http://s1.etowns.server-on.net/~yamada_ ... client.cpp
ここにアップロードしました。
新しく関数を追加しました。
took_size関数は
先頭にあるサイズデータを
習得します。
先頭には
"0000012345"
というように10進数で
10文字数字が入っています。
これを数値に変えるのが
took_size関数です。
正直自信がないので見ていただきたいです。
あと未完成ながらも
my_recv関数も追加しました。
引数はrecv関数と同じで、
分割されたデータに対応できます。
こちらも見ていただけると幸いです。
ソースコードが汚いですが、
よろしくお願いします。
http://s1.etowns.server-on.net/~yamada_ ... client.cpp
ここにアップロードしました。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: TCPにおいてエラー10038が発生してしまう。
すいません。今日は見れません。
明日また見ますので。
明日また見ますので。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 181
- 登録日時: 13年前
Re: TCPにおいてエラー10038が発生してしまう。
すみません。
コメント入れ忘れていましたし、
ソースもぐちゃぐちゃでした。
今改善したので
お願いします。
では また 明日。
コメント入れ忘れていましたし、
ソースもぐちゃぐちゃでした。
今改善したので
お願いします。
では また 明日。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: TCPにおいてエラー10038が発生してしまう。
見ましたので問題点を書きます。
ポインタ・配列理解や文字列の扱いなどにかなり不安を感じます。
1.1回目のrecvでエラー処理がありません。
2.if(output == tooksize)
outputがバッファのoutputと名前がかぶって分かりづらいです。
lenとかサイズを表す名称を何処かに入れて下さい。
3.my_recv関数内においてrecvbuffとbuffの扱いに混乱が見受けられます。
recvlen=recv(sock,recvbuff,size,flag);
recv関数でrecvbuffのサイズがなぜbuffのsizeなのでしょうか?全部がBUFF_SIZE前提の設計はマズイです。
4.上と同様ですが
strcat(buff,recvbuff);
のあと
recvbuff[tooksize]='\0';
は手遅れです。
5.2回目のrecvからcryptがなくなっています。
6.if(len>size || len == tooksize)の時に
strcat(buff,recvbuff);
が無いのでバッファがコピーされません。
それとlen>sizeの時はエラー表示したほうが良いと思います。
ここからはtook_size専用です。
T1.took_sizeの戻り値が-1の時の処理がありません。
T2. number = buff;だと0サプレスにはなりません。それよりも危険なことが起こります。
000の時の動作をデバッガで確認してみて下さい。
T3. if(buff=='0' && check==0)//余計な部分だった場合
コレは連続する0には対処できていません。
T4. size = (int)( number - '0' );
ポインタ値から文字'0'を引いても不思議な値しか求まりません。
文字型の数値からint型への変換が根本的に間違っています。
実は便利な関数もありますが、ここはあえて自力で数値型に変換してみて下さい。
ヒントは各桁は10倍づつである。って事です。
ちなみに、BUFF_SIZEを8192とか16384とかにすればローカルでも分割をテストできるはずです。
ポインタ・配列理解や文字列の扱いなどにかなり不安を感じます。
1.1回目のrecvでエラー処理がありません。
2.if(output == tooksize)
outputがバッファのoutputと名前がかぶって分かりづらいです。
lenとかサイズを表す名称を何処かに入れて下さい。
3.my_recv関数内においてrecvbuffとbuffの扱いに混乱が見受けられます。
recvlen=recv(sock,recvbuff,size,flag);
recv関数でrecvbuffのサイズがなぜbuffのsizeなのでしょうか?全部がBUFF_SIZE前提の設計はマズイです。
4.上と同様ですが
strcat(buff,recvbuff);
のあと
recvbuff[tooksize]='\0';
は手遅れです。
5.2回目のrecvからcryptがなくなっています。
6.if(len>size || len == tooksize)の時に
strcat(buff,recvbuff);
が無いのでバッファがコピーされません。
それとlen>sizeの時はエラー表示したほうが良いと思います。
ここからはtook_size専用です。
T1.took_sizeの戻り値が-1の時の処理がありません。
T2. number = buff;だと0サプレスにはなりません。それよりも危険なことが起こります。
000の時の動作をデバッガで確認してみて下さい。
T3. if(buff=='0' && check==0)//余計な部分だった場合
コレは連続する0には対処できていません。
T4. size = (int)( number - '0' );
ポインタ値から文字'0'を引いても不思議な値しか求まりません。
文字型の数値からint型への変換が根本的に間違っています。
実は便利な関数もありますが、ここはあえて自力で数値型に変換してみて下さい。
ヒントは各桁は10倍づつである。って事です。
ちなみに、BUFF_SIZEを8192とか16384とかにすればローカルでも分割をテストできるはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 181
- 登録日時: 13年前
Re: TCPにおいてエラー10038が発生してしまう。
データの先頭からデータサイズを受け取る
関数を新しく作り直しました。
やはり眠い状態で作った昨日の関数とは
質が違います。
テスト済みで、我ながらよくやったと思っています。
ところでchar型において
0,1,2,3,4,5,
という数字は
16進数で
0x30,0x31,0x32,0x33,0x34,0x35
ですか。
関数を新しく作り直しました。
やはり眠い状態で作った昨日の関数とは
質が違います。
テスト済みで、我ながらよくやったと思っています。
ところでchar型において
0,1,2,3,4,5,
という数字は
16進数で
0x30,0x31,0x32,0x33,0x34,0x35
ですか。
#include <stdio.h>
#include <string.h>
#define BUFF_SIZE 1024
int TAKE_SIZE_FROM_DATA(char data[BUFF_SIZE])
{
char real_data[11];
int counter_for_data=0;
int counter_for_real_data=0;
int i;
while(counter_for_data<10)
{
if(data[counter_for_data] != '0')
{
break;
}
counter_for_data += 1;
}
i = 10-counter_for_data;
for(; counter_for_real_data<i; ++counter_for_data, ++counter_for_real_data)
{
real_data[counter_for_real_data] = data[counter_for_data];
}
real_data[counter_for_real_data] = '\0';
printf("%s",real_data);
return 0;
}
int main(void)
{
char buff[BUFF_SIZE];
scanf("%s", buff);
int size = strlen(buff);
buff[size] = '\0';
TAKE_SIZE_FROM_DATA(buff);
return 0;
}
-
- 記事: 181
- 登録日時: 13年前
Re: TCPにおいてエラー10038が発生してしまう。
>ヒントは各桁は10倍づつである。って事です。
の意味がようやくわかりました。
前のコメントは無視してください。
あとこれも今気づいたのですが、
変数が 例えば001でも1でもプログラムには影響がないのでしょうか。
001 を二進数にすると
0000・・・0001 で、
1も
0000・・・0001
で同じなので・・・
の意味がようやくわかりました。
前のコメントは無視してください。
あとこれも今気づいたのですが、
変数が 例えば001でも1でもプログラムには影響がないのでしょうか。
001 を二進数にすると
0000・・・0001 で、
1も
0000・・・0001
で同じなので・・・
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: TCPにおいてエラー10038が発生してしまう。
001と1とソースコードに書いたら同じです。010と10は実は違います。0から始まるのは8進法だからです。
文字列の数値をどう解釈するかはプログラムを作る人のさじ加減次第です。
回答を忘れていてました。申し訳ないです。
TAKE_SIZE_FROM_DATAの処理は合っていると思いますが非常に読み辛いコードですね。
iは止めましょう。
こういう処理をゼロ・サプレス処理といいます。
文字列の数値をどう解釈するかはプログラムを作る人のさじ加減次第です。
回答を忘れていてました。申し訳ないです。
TAKE_SIZE_FROM_DATAの処理は合っていると思いますが非常に読み辛いコードですね。
iは止めましょう。
こういう処理をゼロ・サプレス処理といいます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 181
- 登録日時: 13年前
Re: TCPにおいてエラー10038が発生してしまう。
sprintf(sendbuff,"%10.d%s",size += 10, command);
とすると、sendbuffには
" 14test"
と代入されます。
"000014test"
のように代入されてほしかったのですが、
なぜ空白なのでしょうか。
とすると、sendbuffには
" 14test"
と代入されます。
"000014test"
のように代入されてほしかったのですが、
なぜ空白なのでしょうか。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: TCPにおいてエラー10038が発生してしまう。
%010dをお試しください。helloworld1853 さんが書きました:sprintf(sendbuff,"%10.d%s",size += 10, command);
とすると、sendbuffには
" 14test"
と代入されます。
"000014test"
のように代入されてほしかったのですが、
なぜ空白なのでしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 181
- 登録日時: 13年前
Re: TCPにおいてエラー10038が発生してしまう。
softyaさんありがとうございます。
http://s1.etowns.server-on.net/~yamada_ ... client.cpp
http://s1.etowns.server-on.net/~yamada_ ... server.cpp
完成しました。
動作確認しました。
ソースコードが汚い以外に
問題点はないと思います。
きれいなソースコードについて質問したいのですが、
新しくトピックをたてたほうがいいでしょうか。(深い内容になりそうなので、)
http://s1.etowns.server-on.net/~yamada_ ... client.cpp
http://s1.etowns.server-on.net/~yamada_ ... server.cpp
完成しました。
動作確認しました。
ソースコードが汚い以外に
問題点はないと思います。
きれいなソースコードについて質問したいのですが、
新しくトピックをたてたほうがいいでしょうか。(深い内容になりそうなので、)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: TCPにおいてエラー10038が発生してしまう。
おめでとうございます。helloworld1853 さんが書きました:softyaさんありがとうございます。
http://s1.etowns.server-on.net/~yamada_ ... client.cpp
http://s1.etowns.server-on.net/~yamada_ ... server.cpp
完成しました。
動作確認しました。
ソースコードが汚い以外に
問題点はないと思います。
きれいなソースコードについて質問したいのですが、
新しくトピックをたてたほうがいいでしょうか。(深い内容になりそうなので、)
そうですね別トピックが良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
- 記事: 181
- 登録日時: 13年前
Re: TCPにおいてエラー10038が発生してしまう。
ありがとうございます。
通信系の問題は解決されたので、
ここで終わりにしたいと思います。
しかし、"ソースコードの美しさ"について問題が多いので、
http://dixq.net/forum/viewtopic.php?f=3&t=11189
ここにて先ほどのソースコードを
中心に "きれいなソースコードの書き方" について
質問させていただきました。
よろしければこちらもお願いします。
回答してくださった皆様ありがとうございました。
通信系の問題は解決されたので、
ここで終わりにしたいと思います。
しかし、"ソースコードの美しさ"について問題が多いので、
http://dixq.net/forum/viewtopic.php?f=3&t=11189
ここにて先ほどのソースコードを
中心に "きれいなソースコードの書き方" について
質問させていただきました。
よろしければこちらもお願いします。
回答してくださった皆様ありがとうございました。