关于c/c++ 网络编程,无论在linux还是windows,要说到自由性,和安全性,socket无疑是比较好的!对于socket,因为它的传输协议只有两种tcp和udp,属于网络层,这里我们不去重点讨论。
关于应用层协议http,如何用C/C++的socket来实现数据传输和下载呢?
1. http是超文本协议,用在html文件中,那么对于html是如何传输数据呢?
通过post或者get传输表单数据,当然http还有其他的方式head,put ,delete,option,trace等方式。head和get差不多,唯一的区别就是head只返回协议头,put和post也很相似,但是可惜html表单数据不支持这一特性,put和post的区别在于,put说出来资源放置于服务器的位置,而post没有,post将这项权利给予服务器来使用。delete顾名思义,就是指定删除在服务器上的资源,option一般用来获取当前URl所支持请求的方法(就是上诉的六种)。
对于c/c++传输单数据,get方法:
get方法, 形如: http://i.cnblogs.com/EditPosts.aspx?opt=1
这个表单传输的数据就是1,其中键值就是opt,这个需要和服务器上的保持一致
对于一个简单的html
1 <html> 2 <head><title>右边</tile></head> 3 <body> 4 <form > 5 <input type="text", name="opt" > 1 </input> 6 </form> 7 </body> 8 </html>
opt就是键值
那么用socket如何实现:
首先,windows下,我们
1. 先要启动异步套接字启动命令
//初始化套结字动态库 2 if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0) //异步套接字启动命令 3 /版本(次,主) //返回socket实现细节信息 4 { 5 system("WSAStartup failed!\n"); 6 system("pause"); 7 return -1; 8 }
2.在想linux下一样,创建套接字
sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
3.绑定端口号,和设置要访问的服务器主机地址
//设置服务器地址 servAddr.sin_family = AF_INET; servAddr.sin_addr.s_addr = inet_addr("203.195.192.24"); servAddr.sin_port = htons((short)80);
4.连接服务器
1 retVal = connect(sHost, (LPSOCKADDR)&servAddr, sizeof(servAddr));
5.然后接收信息字段
char *pHttpGet = "GET %s?%s HTTP/1.1\r\n" "Host: %s:%d\r\n\r\n"; char strHttpGet[1024] = { 0 }; //ZeroMemory(strHttpGet, BUF_SZIE); //初始化内存 char msg[]="username=Gjxun&pwd=sssssss"; sprintf(strHttpGet, pHttpGet, addr, msg, host, port); int var = send(sHost, strHttpGet, strlen(strHttpGet), 0);
recv(sHost,rebuf ,sizeof(rebuf),0);
最后关闭的时候。需要用这个来关闭异步套接字
1 WSACleanup( );
这是http的基本流程,对于get发送单个或者多个表单数据如上面所示
对于post而言,情况 会多些,也会复杂些
1.如果发送的是单个或者多个字段信息,那么我们的处理方式大致可以有下面这两种
第一种: 就像get一样,只不过单纯的将数据放置于协议的后面,需要注意点的是,格式比较重要,特别协议头和正文部分之间需要各一个空行:
下面的msg亦可以和get一样写成 msg="username=Gxjun&pwd=ssssss"; 还有content-Length的长度: 是正文和正文数据以及尾部长度之后不需要算协议头长度,不然会,当将连接改为Connection: Keep-Alive 出现服务器长时间接受现象。---指导服务器接受到结尾帧或者数据长度达到那个长度为止,才会响应刚才的动作!&#