私は今、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通信を行うのに、参考になるサンプルソース
や、
サイトなど、ご教授よろしくお願いします。
SOCK_DGRAM を使っている点が問題だと思います。
それと、CAsyncSocketは非同期であるため、
使いづらく分かりづらいと思いますので、
CSocketをお勧めします。
CSocket s;
s.Connect(...);
s.Send(...);
s.Receive(...);
wood さん dairygoods さん ご返答ありがとうございます。
ご指摘の通り、kSOCK_DGRAMに問題があったようです。
無事解決しました。