ソケットでのHTTP通信プログラムのやり方について – プログラミング – Home

ソケットでのHTTP通信プログラムのや...
 
通知
すべてクリア

[解決済] ソケットでのHTTP通信プログラムのやり方について


bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
Topic starter  

私は今、CInternetSession,CHttpConnection,CHttpFileが好ましい動作をして
くれない為、SocketでHTTP通信を行おうとプログラムを組んでいます。

何を使ったらよいのかわからなかった為、CAsyncSocketを使うことにしました。
環境は
VisualC++ 6.0 SP4
OS Win2000,XP

ソースは大体以下のようになっています。

ヘッダー定義

#define MAX_SOCKBUF 256

//ダイアログクラス内メンバ

CAsyncSocket m_Sock

..省略

OnInitDialog ソケット初期化

if(!m_Sock.Create(NULL,SOCK_DGRAM, FD_READ | FD_WRITE | FD_OOB |
FD_ACCEPT | FD_CONNECT | FD_CLOSE )){

}

if(!m_Sock.Connect(プロキシサーバーのアドレス,プロキシサーバーのポート)){

}

if(!m_Sock.SetSockOpt( SO_SNDBUF, &buf_size, sizeof(buf_size))){

}

if(!m_Sock.SetSockOpt( SO_RCVBUF, &buf_size, sizeof(buf_size))){

}

if(!m_Sock.AsyncSelect(FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT |
FD_CONNECT | FD_CLOSE)){

}

OnButton1 ボタンを押して、 http://www.google.co.jp/をとりあえず取得してみる

char Buf[MAX_SOCKBUF];
sprintf(Buf,GET http://www.google.co.jp/ HTTP/1.0\r\n\r\n);
int SendByte = Send(Buf,strlen(Buf),0);
if(!SendByte){

}

OnReceive リクエストに対するHTTPレスポンスを受け取る予定
char Buf[MAX_SOCKBUF];
memset(Buf,'\0',sizeof(Buf));
int Ret = Receive(Buf,MAX_SOCKBUF,0) ;

if(Ret== SOCKET_ERROR){
ここでエラー WSAECONNRESET 
}

OnReceiveのところでReceiveエラーが返ってくるのですが、
「リモート側から仮想回路がリセットされました。 」
というエラーがなぜ起こるのか、そもそもこのやり方で、HTTPのやり取りができている
のか
わかりません。

上記の問題点、または、ソケットでHTTP通信を行うのに、参考になるサンプルソース
や、
サイトなど、ご教授よろしくお願いします。


引用未解決
トピックタグ
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

お勧めの書籍
http://www.kumei.ne.jp/c_lang/
ここの「ネットワークプログラミング」


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

SOCK_DGRAM を使っている点が問題だと思います。

それと、CAsyncSocketは非同期であるため、
使いづらく分かりづらいと思いますので、
CSocketをお勧めします。

CSocket s;
s.Connect(...);
s.Send(...);
s.Receive(...);


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
Topic starter  

wood さん dairygoods さん ご返答ありがとうございます。

ご指摘の通り、kSOCK_DGRAMに問題があったようです。

無事解決しました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました