如何用SOCKET编程实现POST数据到WEB服务器,并取得返回数据

iuhxq 2004-08-26 09:17:09
不要用http://dev.csdn.net/develop/article/11/11914.shtm这里提到的方式


只要用socket实现的,这样即可以学socket有可以解决问题,呵呵
...全文
523 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
iuhxq 2004-08-27
  • 打赏
  • 举报
回复
小弟我实在菜,能否把代码发给我?

iuhxq@hotmail.com

谢谢!
xdljf 2004-08-26
  • 打赏
  • 举报
回复
修正一下
sprintf(szBuffer, "GET %s HTTP/1.1\r\n", lpFileName);

看看flashget是怎么玩的,参考资料http://www.ietf.org/rfc/rfc2068.txt

Mon Jul 26 11:02:20 2004 正在连接代理服务器 127.0.0.1 [IP=127.0.0.1:1040]
Mon Jul 26 11:02:20 2004 已连接.
Mon Jul 26 11:02:20 2004 Socks: 05 01
Mon Jul 26 11:02:20 2004 Socks: 05 00
Mon Jul 26 11:02:20 2004 Socks: 05 01
Mon Jul 26 11:02:21 2004 Socks: 05 00

Mon Jul 26 11:02:21 2004 GET /down/beta_SocksOnlineV2.zip HTTP/1.1
Mon Jul 26 11:02:21 2004 Host: crc.onlinedown.net
Mon Jul 26 11:02:21 2004 Accept: */*
Mon Jul 26 11:02:21 2004 Referer: http://crc.onlinedown.net/down
Mon Jul 26 11:02:21 2004 User-Agent: Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)
Mon Jul 26 11:02:21 2004 Pragma: no-cache
Mon Jul 26 11:02:21 2004 Cache-Control: no-cache
Mon Jul 26 11:02:21 2004 Connection: close

Mon Jul 26 11:02:21 2004 HTTP/1.1 200 OK
Mon Jul 26 11:02:21 2004 Server: Microsoft-IIS/5.0
Mon Jul 26 11:02:21 2004 Connection: close
Mon Jul 26 11:02:21 2004 Date: Mon, 26 Jul 2004 02:59:24 GMT
Mon Jul 26 11:02:21 2004 Content-Type: application/x-zip-compressed
Mon Jul 26 11:02:21 2004 Accept-Ranges: bytes
Mon Jul 26 11:02:21 2004 Last-Modified: Tue, 13 Apr 2004 03:09:13 GMT
Mon Jul 26 11:02:21 2004 ETag: "9e17cfb2421c41:934"
Mon Jul 26 11:02:21 2004 Content-Length: 351209
Mon Jul 26 11:02:21 2004 开始接受数据!
Mon Jul 26 11:02:25 2004 User Cancel at 165414.
oyljerry 2004-08-26
  • 打赏
  • 举报
回复
一个get的,看有没有帮助
SOCKET Socket;

Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (Socket == INVALID_SOCKET)
{
PRINTERROR("socket()");
return;
}


//
// Find the port number for the HTTP service on TCP
//
LPSERVENT lpServEnt;
SOCKADDR_IN saServer;

lpServEnt = getservbyname("http", "tcp");
if (lpServEnt == NULL)
saServer.sin_port = htons(80);
else
saServer.sin_port = lpServEnt->s_port;


//
// Fill in the rest of the server address structure
//
saServer.sin_family = AF_INET;
saServer.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);


//
// Connect the socket
//
int nRet;

nRet = connect(Socket, (LPSOCKADDR)&saServer, sizeof(SOCKADDR_IN));
if (nRet == SOCKET_ERROR)
{
PRINTERROR("connect()");
closesocket(Socket);
return;
}


//
// Format the HTTP request
//
char szBuffer[1024];

sprintf(szBuffer, "GET %s\n", lpFileName);
nRet = send(Socket, szBuffer, strlen(szBuffer), 0);
if (nRet == SOCKET_ERROR)
{
PRINTERROR("send()");
closesocket(Socket);
return;
}
purplelucy 2004-08-26
  • 打赏
  • 举报
回复
借楼主的地盘问一句。用POST方式发送数据时,正文数据的包装规则是什么呢?是不是空格以加号代替,特殊字符用ASCII码?那么中文该怎么弄呢?
Mycro 2004-08-26
  • 打赏
  • 举报
回复
我也有同样的问题,

能否远程操作Access 的数据库?
JJONY 2004-08-26
  • 打赏
  • 举报
回复
其实用SOCKET实现POST是一件比较简单的事件, 首先你要搞清楚HTTP协议的运作原理,具体的我就忘了, 在网上找找吧。 不过大概是HTTP协议都是以字符串传输。 也就是说客户端写上含“POST”格式的HTTP字符串发送到服务器端,然后等回应就得了。回应也是字符串,难点是你要把服务器的回应字符串中的字段进行解释。可能会受到网络速率问题,回应数据要分成多次的Recv接收,要做成IE那种边接收边显示,好难哦。

还有一个难点就是如果你有二进制数据如文件,那么要把它编码成BASE64,不过这个都可以在网上找到代码。
DentistryDoctor 2004-08-26
  • 打赏
  • 举报
回复
你这个的Post是什么意思?
sunshinee 2004-08-26
  • 打赏
  • 举报
回复
楼上几位已经说得很详细了,提醒一下,就是http中head和body之间是有一个空行的。
醉马不肖 2004-08-26
  • 打赏
  • 举报
回复
用siffer抓一些包,不就ok
purplelucy 2004-08-26
  • 打赏
  • 举报
回复
偶来写一段,自己收到想要的返回的信息了。不知道对楼主有点提示没有。

构造发送包:
CString StrSend;
StrSend.Format("POST /accessinterface.php HTTP/1.1\r\nHost: %s\r\n",hostip); //方法、请求的页面、HTTP版本、主机名
CString strtemp;
strtemp.Format("Referer: http://%s/index.asp\r\n",hostip);//Referer页面
StrSend += strtemp;
StrSend += "Accept:*/*\r\n"; //接受的数据类型
StrSend += "Accept-Language: zh-cn\r\n";//Accept-Language
StrSend += "Content-Type: application/x-www-form-urlencoded\r\n";
StrSend += "Accept-Encoding: gzip, deflate\r\n";
StrSend += "User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\r\n";
StrSend += "Connection: Keep-Alive\r\n";
CString datasend;
//这是正文的数据,类似这样的格式提交给页面上的参数。哎呀,自己不会说。
datasend.Format("userID=%s&filename=%s&command=read&result=&reserved=1",
userID,filename);
int nLength = datasend.GetLength();
strtemp = "";
strtemp.Format("Content-Length: %d\r\n",nLength);
StrSend += strtemp; //发送内容的长度
StrSend += "\r\n"; //空行标志请求头的结束
StrSend +=datasend; //发送的数据段内容

后面就是send...
然后recv。。。分析收到的结果。这个不要说了吧。

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧