• 締切済み

WinsockでwebにPOSTした後の処理について

Winsockコントロールを使って掲示板などにPOSTでデータを送信する際、ヘッダー部分で Content-Length: ~~~ も送信してるのですが、 Content-Length:の値分のDATA?を送らないとサーバー側がずっと待機する状態になると思うのですが、 これはWinsockのCloseメソッドを使えばサーバーの待機状態が解除されますか? また、SendDataの途中でプログラムを終了する場合もCloseメソッドでいきなり閉じても大丈夫でしょうか? 自分が書いた該当部分のソースは下記の通りです。 Dim strHead As String 'ヘッダー Dim strData As String 'データ 'いろいろな処理  strHead=strHead & vbCrLf & "Content-Length: " & LenB(StrConv(strData, vbFromUnicode)) & vbCrLf & vbCrLf  'strHeadとstrDataにはきちんとデータが入ってる  Winsock1.SendData strHead & strData End Sub そして Winsock1_DataArrivalプロシージャーに Dim strBuf As String  Winsock1.GetData strBuf  If Instr(1,strBuf,"</HTML)") > 0 Then   Sleep 1000:DoEvents   Winsock1.Close  End If Form_QueryUnloadプロシージャーに  Sleep 1000:DoEvents  Winsock1.Close End Sub

みんなの回答

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

> これはWinsockのCloseメソッドを使えばサーバーの待機状態が解除されますか? 一応大丈夫(サーバ側の実装による)だが、お行儀が良いとは言えないだろうな。 > また、SendDataの途中でプログラムを終了する場合もCloseメソッドでいきなり閉じても大丈夫でしょうか? 一応大丈夫(サーバ側の実装による)だが、これまたお行儀が良いとは言えないだろうな。 蛇足だが、HTTPを使う場合、WinSockの変わりにWinInetを使うとこのあたりの制御は一切気に掛けなくてよくなる。

yu_mitsui
質問者

補足

一応大丈夫みたいですが、やはりいきなりCloseするのは一般的な方法では無いみたいですね。 普通はどのように処理をするのか教えてくださると助かります。 WinInetに関しては調べてみることにします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VB6のwinsockでconnectできない

    socketでconnectすると、sckclosingとなって通信できない。 機械との通信プログラムをつくるため、インターネットから以下のようなサンプルを取って、同一コンピュータ、または異なるコンピュータ間で通信しようとした(一部省略、改変)が、stateが8となってしまいます。socketを使うのは初めてで、皆目見当がつきません。よろしくお願いします。 サーバー側 Private Sub Form_Load() Winsock1.LocalPort = 1001 Winsock1.Listen -------- End Sub Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) Dim dat As String, ans As String Dim n As Integer Winsock1.GetData dat Text1.Text = dat Winsock1.SendData "わかりません" End Sub Private Sub Form_Load() Text1.Text = "abc" (正しいコンピュータ名を入れた) Winsock1.Close LabCon.Caption = "Closed": LabCon.BackColor = vbWhite End Sub クライアント側 Private Sub Command1_Click() Winsock1.Close Winsock1.RemoteHost = Text1.Text Winsock1.RemotePort = 1001 'ポート番号設定 Winsock1.Connect Do While (Winsock1.State <> sckConnected) LabCon.Caption = Winsock1.State DoEvents Loop End Sub クライアントでcommand1ボタンをクリックすると最初はstateが0、ループに入ると8となって出られません。WindowsXP、Vista共に同じ結果でした。

  • Winsockを利用したファイルの送受信について

    こんにちは。現在、VisualBasicでwinsockを利用して jpg画像の転送をやりたいと思っているのですが、うまくいきません。 制御用のプログラムなのでjpg画像は2分割して送ります。 ちょっと汚いソースで申し訳ないのですが、クライアント側は以下のようになってます。ソケット1で通信の制御信号を送受信して、ソケット2で実際の画像データを送信します。画像は2分割にして送ります。 Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) Dim sSend As String Dim buffer() As Byte Dim lSendSize As Long Winsock1.GetData buf, vbString, bytesTotal Select Case buf Case SIG_REQUESTIMAGE     f = FreeFile sFile = "send.jpg" Open sFile For Binary As #f lFileSize = LOF(f) sSend = CStr(lFileSize) Winsock1.SendData sSend DoEvents Case "reciv_size" '画像サイズ受信確認信号1       lSendSize = lFileSize - 1 l1SendSize = lSendSize / 2 l2SendSize = lSendSize - l1SendSize ReDim buffer1(l1SendSize) ReDim buffer2(l2SendSize) Get #f, , buffer1       sCommand = CStr(buffer1) Get #f, , buffer2 Winsock2.SendData sCommand  Case "reciv1" '画像サイズ受信確認信号2 sCommand = CStr(buffer2)       Winsock2.SendData sCommand       Close #f

  • WinSockを使ってのプリンタ接続・データ送信

    現在LANで接続されたプリンタに文字列を印字させるプログラムを作成しているのですが、プリンタ側のIPアドレス、使用するポート(今回は1024という指定があったのでそれに設定)を設定し、印字処理をはしらせたのですが、そこでエラーが発生してしまいます。簡略化していますが、プログラムは Private sckWinsock As Winsock Set sckWinsock = Winsock1 sckWinsock.Protocol = sckTCPProtocol sckWinsock.RemoteHost = "192.168.0.***" sckWinsock.RemotePort = 1024 sckWinsock.LocalPort = 0 sckWinsock.Connect strData = "テスト印字" sckWinsock.SendData strData sckWinsock.Close エラーは sckWinsock.SendData strData ここで発生し、『指定したトランザクションまたは要求のプロトコルまたは接続状態に問題があります。』とでます。 PINGはちゃんと通りますし、プリンタ設定にあるテスト印字は問題なく機能するので、プリンタとの接続がまずいとは思えないのですが・・・ WinSockを使うのは初めてなので勝手がわからなく苦戦中です どなたかわかる方、お返事お待ちしています

  • winsock通信時エラーの回避

    winsock通信でデータをクライアント側からサーバー側に送り、一定の条件でサーバー側からクライアント側にデータを戻すソフトを作成中なのですが、サーバー側が通信エラーの為か止まってしまいます。 サーバー側(winsock部分)記述 Private Sub Winsock1_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean) Winsock1(Index).Close '接続を閉じる Do While Not (Winsock1(Index).State = sckClosed) DoEvents Loop On Error Resume Next Winsock1(Index).Listen If Winsock1(Index).LocalPort <> 0 Then Winsock1(Index).LocalPort = 0 End If End Sub 質問の整理ですが、 表示板にはギミックが付いておりそのギミックは止まらないのでパソコンのフリーズでは無い様子です。 で問題は通信部分だと推測されるのですが、そのエラーを起こした通信を破棄してもいいので、サーバー側の点数加算を止めない方法はありませんでしょうか。 また上記のWinsock1_Errorコードの記述じゃおかしいのでしょうか。

  • 文字化けしてしまいます。

    すみませんが 教えてください。 現在 メールソフトを作成しておりますが 一部メールソフトで 受信した時に どうしても件名が文字化けをしてしまいます。 文字化けをおこすメーラー:i-mode、Becky 正しく表示するメーラー:OutlookExpress できるだけi-mode上でも正確に表示させたいのですが どなたかお教えくださいませ。 現在下記のように書いております。 Winsock1.SendData("MIME-Version: 1.0" + vbcrlf) Winsock1.SendData("Content-Type:text/plain; charset=shift_jis" + vbcrlf) Winsock1.SendData("Content-Transfer-Encoding:7bit" +vbcrlf) Winsock1.SendData(SujectValue + vbcrlf) よろしくお願い致します。

  • Winsockのオブジェクトエラー

    こんにちは。EXCEL2000・VBAで、Winsockの使用を考えています。 以下のソースコードを入力して、実行してもオブジェクトが見つかりませんという、エラーが出力されてしまいます。 また、Winsockをアクティブにしようと、 User FormにWinsockのアイコンを追加しようとしても 「サブジェクトは指定された操作に対して信頼されません」 という注意書きがでてしまって、追加できません。 なぜ、このようになるのか、教えていただけますか? よろしくお願いします。 Private Sub CommandButton1_Click() Winsock1.RemoteHost "www.yahoo.co.jp" Winsock1.RemotePort 80 Winsock1.Connect End Sub Private Sub CommandButton2_Click() Winsock1.SendData = TextBox1.Value End Sub Private Sub CommandButton3_Click() Winsock1.Close End Sub

  • ユーザー構造体

    以下のようなことはできないのでしょうか? Type TEST strData1 as String * 1 strData2 as String * 1 strData3 as String * 2 End Type Function BATCH() Dim Wk1 as String Dim Wk2 as TEST Wk1="TEST" Wk2=Wk1 * Wk2.strData1にT * Wk2.strData1にE * Wk2.strData1にSTが代入されるようなイメージ * 一般的はWk2.strData1=Mid(Wk1,1,1)とかですよね。 End Function どなたかわかる方ご教授してください。

  • 保存の仕方

    こんにちは、次のようなアドレスを入力するとそのソースを表示するプログラムを作ったのですがこれで表示されるソースに名前を付けて保存することってできますか?お願いします。 Private Sub Command1_Click() Dim strUrl As String Dim strBuf As String Command1.Enabled = False strUrl = InputBox("URLを入力して下さい.") If (Len(strUrl) = 0) Then Exit Sub End If Command1.Enabled = True strBuf = Inet1.OpenURL(strUrl) Form2.Show Form2.Text1.Text = strBuf End Sub Function Getsource() As String Dim strBuf As String Dim strUrl As String strBuf = Inet1.OpenURL(strUrl) 'ファイル内容を取得 Getsource = strBuf End Function

  • フレーム分割のソース表示プログラムについて

    以前次のようなプログラムを作ったのですが、これはURLを入力するとブラウザのソースを表示するものなので、フレームによって分割されたページのソースはすべて表示させることができません。このプログラムに何か追加して分割されていてもソースが表示できるようにしたいのですが。新たにコマンドを作ってやるしかないのでしょうか?何かアドバイスお願いします。 Private Sub Command1_Click() Dim strUrl As String Dim strBuf As String Command1.Enabled = False strUrl = InputBox("URLを入力して下さい.") If (Len(strUrl) = 0) Then Exit Sub End If Command1.Enabled = True strBuf = Inet1.OpenURL(strUrl) Form2.Show Form2.Text1.Text = strBuf End Sub Function Getsource() As String Dim strBuf As String Dim strUrl As String Dim strUrl2 As String strBuf = Inet1.OpenURL(strUrl) 'ファイル内容を取得 strUrl2 = InStr(strBuf, "frame src=") If strUrl2 > 0 Then strUrl3 = Mid(strBuf, strUrl2, 100) strUrl4 = Mid(strUrl3, 1, l) Getsource = strBuf End Function

  • ソース内の文字検索について

    下にHPのソースを表示させるプログラムがあります。 これで表示されたソースの中からある文字を検索したいのですが、それってできますか?どうしたらいいんでしょうか、お願いします。 Private Sub Command1_Click() Command1.Enabled = False Text1.Text = GetSource() Command1.Enabled = True End Sub Function GetSource() As String Dim strBuf As String Dim strURL As String strURL = "http://www.microsoft.com/japan/ms.htm" strBuf = Inet1.OpenURL(strURL) GetSource = strBuf End Function

このQ&Aのポイント
  • E540の電源ボタンのLEDがつかない現象について
  • 電源ボタンを押してもLEDが点灯しない問題の対処方法
  • Lenovo E540の電源ボタンのLED点灯トラブルに関する解決策
回答を見る

専門家に質問してみよう