TCPにおいてエラー10038が発生してしまう。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
helloworld1853
記事: 181
登録日時: 13年前

Re: TCPにおいてエラー10038が発生してしまう。

#31

投稿記事 by helloworld1853 » 13年前

sendするときに
どんなときでも1024B
送信してしまう問題を解決し忘れていました。
これを解決したら直りました。

あと分割対応recv関数を
作っているのですが、
0になるまでループを続けるということは
sendも繰り返さなくてはならないのですか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: TCPにおいてエラー10038が発生してしまう。

#32

投稿記事 by softya(ソフト屋) » 13年前

helloworld1853 さんが書きました:sendするときに
どんなときでも1024B
送信してしまう問題を解決し忘れていました。
これを解決したら直りました。
なんとなく治ったでは理解になりませんので元に戻してオーバーしている事実を確認したほうが良いです。
デバッグは
1)実際の問題点の確認。
2)推測される問題点を修正。
3)治ったことを確認
でちゃんとしたデバッグの完了です。
1)などを手を抜くとろくな事はありません。
helloworld1853 さんが書きました: あと分割対応recv関数を
作っているのですが、
0になるまでループを続けるということは
sendも繰り返さなくてはならないのですか。
分割は、パソコンのOSやスイッチングハブ、ルータ、モデム、インテーネット経路などの都合で起こりますので送信する側は気にしなくて良いです。
逆に言えば分割したくなくても分割されます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

helloworld1853
記事: 181
登録日時: 13年前

Re: TCPにおいてエラー10038が発生してしまう。

#33

投稿記事 by helloworld1853 » 13年前

1)実際の問題点の確認。
データの大きさが1024だと
メモリ違反を起こしてしまう
原因char output[1024];は
output[0]からoutput[1023]
までしかない。
そこに
output[1024] = '\0';
と代入するとメモリ違反が起きる。

2)推測される問題点を修正。
scanf_sのあとに
strlenでサイズ特定
し、send関数に渡す
1024を越えることがなくなる

3)治ったことを確認
確認しました。

送られてきたデータが
分割されたデータの一部なのか、
それで全部のデータなのか判断する方法はありますか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: TCPにおいてエラー10038が発生してしまう。

#34

投稿記事 by softya(ソフト屋) » 13年前

helloworld1853 さんが書きました:1)実際の問題点の確認。
データの大きさが1024だと
メモリ違反を起こしてしまう
原因char output[1024];は
output[0]からoutput[1023]
までしかない。
そこに
output[1024] = '\0';
と代入するとメモリ違反が起きる。

2)推測される問題点を修正。
scanf_sのあとに
strlenでサイズ特定
し、send関数に渡す
1024を越えることがなくなる

3)治ったことを確認
確認しました。

デバッグとは、そういう事です。基本的に怪しい所を闇雲に修正はせず。
間違っていることを確認してから修正して下さい。そうすれば後から変なバグに悩まされずに済みます。
helloworld1853 さんが書きました: 送られてきたデータが
分割されたデータの一部なのか、
それで全部のデータなのか判断する方法はありますか。
無いので通常は送信データ先頭に送信データサイズのデータを付与します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

helloworld1853
記事: 181
登録日時: 13年前

Re: TCPにおいてエラー10038が発生してしまう。

#35

投稿記事 by helloworld1853 » 13年前

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が発生してしまう。

#36

投稿記事 by softya(ソフト屋) » 13年前

すいません。今日は見れません。
明日また見ますので。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

helloworld1853
記事: 181
登録日時: 13年前

Re: TCPにおいてエラー10038が発生してしまう。

#37

投稿記事 by helloworld1853 » 13年前

すみません。
コメント入れ忘れていましたし、
ソースもぐちゃぐちゃでした。
今改善したので
お願いします。

では また 明日。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: TCPにおいてエラー10038が発生してしまう。

#38

投稿記事 by softya(ソフト屋) » 13年前

見ましたので問題点を書きます。
ポインタ・配列理解や文字列の扱いなどにかなり不安を感じます。

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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

helloworld1853
記事: 181
登録日時: 13年前

Re: TCPにおいてエラー10038が発生してしまう。

#39

投稿記事 by helloworld1853 » 13年前

データの先頭からデータサイズを受け取る
関数を新しく作り直しました。
やはり眠い状態で作った昨日の関数とは
質が違います。
テスト済みで、我ながらよくやったと思っています。

ところで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;
}

helloworld1853
記事: 181
登録日時: 13年前

Re: TCPにおいてエラー10038が発生してしまう。

#40

投稿記事 by helloworld1853 » 13年前

>ヒントは各桁は10倍づつである。って事です。
の意味がようやくわかりました。
前のコメントは無視してください。
あとこれも今気づいたのですが、
変数が 例えば001でも1でもプログラムには影響がないのでしょうか。
001 を二進数にすると
0000・・・0001 で、
1も
0000・・・0001
で同じなので・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: TCPにおいてエラー10038が発生してしまう。

#41

投稿記事 by softya(ソフト屋) » 13年前

001と1とソースコードに書いたら同じです。010と10は実は違います。0から始まるのは8進法だからです。
文字列の数値をどう解釈するかはプログラムを作る人のさじ加減次第です。

回答を忘れていてました。申し訳ないです。
TAKE_SIZE_FROM_DATAの処理は合っていると思いますが非常に読み辛いコードですね。
iは止めましょう。
こういう処理をゼロ・サプレス処理といいます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

helloworld1853
記事: 181
登録日時: 13年前

Re: TCPにおいてエラー10038が発生してしまう。

#42

投稿記事 by helloworld1853 » 13年前

sprintf(sendbuff,"%10.d%s",size += 10, command);

とすると、sendbuffには
" 14test"
と代入されます。
"000014test"
のように代入されてほしかったのですが、
なぜ空白なのでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: TCPにおいてエラー10038が発生してしまう。

#43

投稿記事 by softya(ソフト屋) » 13年前

helloworld1853 さんが書きました:sprintf(sendbuff,"%10.d%s",size += 10, command);

とすると、sendbuffには
" 14test"
と代入されます。
"000014test"
のように代入されてほしかったのですが、
なぜ空白なのでしょうか。
%010dをお試しください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

helloworld1853
記事: 181
登録日時: 13年前

Re: TCPにおいてエラー10038が発生してしまう。

#44

投稿記事 by helloworld1853 » 13年前

softyaさんありがとうございます。
http://s1.etowns.server-on.net/~yamada_ ... client.cpp
http://s1.etowns.server-on.net/~yamada_ ... server.cpp
完成しました。
動作確認しました。
ソースコードが汚い以外に
問題点はないと思います。
きれいなソースコードについて質問したいのですが、
新しくトピックをたてたほうがいいでしょうか。(深い内容になりそうなので、)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: TCPにおいてエラー10038が発生してしまう。

#45

投稿記事 by softya(ソフト屋) » 13年前

helloworld1853 さんが書きました:softyaさんありがとうございます。
http://s1.etowns.server-on.net/~yamada_ ... client.cpp
http://s1.etowns.server-on.net/~yamada_ ... server.cpp
完成しました。
動作確認しました。
ソースコードが汚い以外に
問題点はないと思います。
きれいなソースコードについて質問したいのですが、
新しくトピックをたてたほうがいいでしょうか。(深い内容になりそうなので、)
おめでとうございます。
そうですね別トピックが良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

helloworld1853
記事: 181
登録日時: 13年前

Re: TCPにおいてエラー10038が発生してしまう。

#46

投稿記事 by helloworld1853 » 13年前

ありがとうございます。
通信系の問題は解決されたので、
ここで終わりにしたいと思います。

しかし、"ソースコードの美しさ"について問題が多いので、
http://dixq.net/forum/viewtopic.php?f=3&t=11189
ここにて先ほどのソースコードを
中心に "きれいなソースコードの書き方" について
質問させていただきました。
よろしければこちらもお願いします。

回答してくださった皆様ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る