51#p126951前回質問させていただいた続きなのですが、サーバーとクライアントを一体にしたプログラムです。プログラム(サーバー)を起動してからiPhoneのWiFiのプロキシ設定のところでローカルIPとサーバーのポートを指定します。↓7iPhone(safari)でHTTPレスポンスを受け取りWebページを表示という流れの自前のProxyサーバーを作ろうとしています。最期の7でiPhoneでの表示がされません。「ページを開けません。ネットワーク接続が切れました。」と出てしまうのですが、どこがダメでそうなってしまってるのかわかりません。解決法を教えてください。0);printf("端末からリクエストを受け取りました。sizeof(out));_tcp_client(inbuf,out);send(sock,out,(int)strlen(out),0);printf("端末へレスポンスを返しました。\n");printf("%d",WSAGetLastError());return;}printf("Webサーバーへ接続しました。send(sock1,send_buf,(int)strlen(send_buf),0);printf("リクエストを送信しました。recv(sock1,r_buf,sizeof(r_buf),0);sprintf(out_buf,"%s%s",out_buf,r_buf);}sprintf(out_buf,"%s\0",out_buf);printf("Webサーバーからレスポンスを取得しました。_tcp_client関数の最後でWSACleanup()を実行しているため、その後のWinSock系の関数、特に81行目のsendが機能しなくなったのではないでしょうか?(コンパイル・テストはしていません)なるほど。5年前WSAStartupとWSACleanupはプロセスにつき一回だけ呼べばいいはずです。WSAStartupとWSACleanupはプロセスにつき一回だけ呼べばいいはずです。okwaveありがとうございます。編集したところ開けるページと開けないページがありました。開けるページはいいのですが、開けないページはiPhone上で-------------------------------ページを開けません。発生したサーバエラー:"RAWデータをデコードできません。"------------------------------となりました。PC側でも200は返ってるのですが、欲しいレスポンスではありませんでした。5年前なんでacceptしたSOCKETに対してのrecvやsendの戻り値を確認していないのですか。recvの戻り値を知らずに,どうやって送られてきたデータの終端を判断しようとしているのですか。なんでacceptしたSOCKETに対してのrecvやsendの戻り値を確認していないのですか。recvの戻り値を知らずに,どうやって送られてきたデータの終端を判断しようとしているのですか。recv(sock,inbuf,sizeof(inbuf),0);sprintf(buf,"%s%s",buf,inbuf);}sprintf(buf,"%s\0",buf);printf("端末からリクエストを受け取りました。sizeof(out));_tcp_client(buf,out);このようにしていたのですが、「問題が発生したため、終了します」っていうエラーが出てしまって。結局原因がわからず、whileを外して放置してました。このようにしていたのですが、「問題が発生したため、終了します」っていうエラーが出てしまって。結局原因がわからず、whileを外して放置してました。そもそも,「問題が発生したため......」はIDE等のデバッガを使っていない場合にWindowsが未処理の例外を検出した場合のメッセージだと思うのですが。どこでそのエラーが起きたかを確認するためにも,IDEでのデバッグは必須です。HTTPのヘッダは確かに文字列ですが,それに続く本体は文字列とは限りません。image/pngなどの画像もありますし,application/octet-streamという「8ビットの並び」としか定義されないようなものも通信されます。,_tcp_clientという関数はそれを強引に(ヌル文字で終端する)文字列として扱ってしまっています。クライアントは正しくデータを処理できません。よって,ヘッダと本体を分離して考え,ヘッダに関しては文字列として扱ってよいですが,本体はバイナリデータとして扱わないと行けません。バイナリデータを扱うには,「データ本体」と「サイズ」を保持する必要があります。本来,サイズはrecvの戻り値によって取得できるのですが,proxyの入力部分でそれを捨ててしまっています。recvしたサイズを保持し,上流へ通信を媒介するときにそのサイズを基にsendする必要がありますし,上流からrecvしたサイズも保持して,下流へ媒介するときにもそのサイズを基にsendする必要があります。7.1.3¶1),利用した場合は未定義の振る舞いとされている(同¶2)ため,使わないことを推奨します。ミクプラは自由にリンクできます。