SOCKET笔记

来源:互联网 发布:知乎值得读的书 编辑:程序博客网 时间:2024/06/01 08:40

WIN下需要包含的头文件和预处理

#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
WSADATA Data;

在开始套接字前要先启动WSAStartup(MAKEWORD(1, 1),&Data),第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。创建套接字的协议:socketserver = socket(AF_INET, SOCK_STREAM, NULL);返回一个SOCKET描述符。

SOCKADDR_IN structserver;、、服务端的结构
SOCKADDR_IN structclient;//客户端的结构
structserver.sin_family = AF_INET;
structserver.sin_port = htons(6000);
structserver.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

然后绑定bind(socketserver, (SOCKADDR*)&structserver, sizeof(SOCKADDR));

监听listen(socketserver, 5);

然后socketclient = accept(socketserver , (SOCKADDR *)&structclient, &sizesockadd);阻塞等待服务端。函数内是等待客户端的信息

memset(buffer, 0, maxsize);
recstatus = recv(socketclient, buffer, maxsize, 0);返回0表示链接中断,-1则是出错。

recstatus  =send(newSocket, buf, strlen(buf) + 1, 0);

closesocket(socketclient );

客户端同样需要先WSAStartup(MAKEWORD(1, 1),&Data),创建套接字,socket(AF_INET, SOCK_STREAM, 0); 和创建一个SOCKADDR_INdestSockAddr结构体内信息与服务端的一样,然后

connect(destSocket, (LPSOCKADDR)&destSockAddr, sizeof(destSockAddr)); 

连上后numsnt=send(destSocket, toSendtxt, strlen(toSendtxt) + 1, NO_FLAGS_SET); 发送信息,而LINUX下相对于WIN则不需要WSAStartup的这些步骤。

最后要WSACleanup();


PYTHON的网络socket

服务端
import socket  
s = socket.socket(socket.AFINET,socket.SOCK_STREAM),//   协议与数据流
然后s.bind(HOST,PORT)使用bind绑定地址和端口使用s.listent(num)监听端口
conn,addr = s.accept()有客户连接时用accept接受。
request = conn.recv(num)//num为缓存大小,用一个对象request接收
conn .sendall(reply)  发送信息
conn.close()关闭连接
客户端
s = socket.socket(socket.AFINET,socket.SOCK_STREAM),//   协议与数据流
然后使用s.connect((HOST,PORT))来连接端口
连接成功就可以s.sendall(reques)发送信息
s.close(关闭)

Python的HTTP服务
服务器会根据request向客户传输的两条信息text_content和pic_content中的一条,作为response文本。response文本是服务器响应连接的文本整个response分为起始行(start line), 头信息(head)和主体(body)三部分。起始行就是第一行。HTTP/1.x 200 OK这里又分3段,HTTP/1.x表示所使用的HTTP版本,200表示状态,是http协议规定的表示服务器正常接收并处理请求,OK是给人阅读的状态
头信息在起始行之后 Content-Type:text/html与主体间有一个空行,主体信息为html或者jpg文件的内容.

request由客户端程序发给服务器。尽管request也可以像response那样分为三部分,request的格式与response的格式并不相同
GET/test.jpg HTTP/1.x
起始行可以分为三部分,第一部分为请求方法(request method),第二部分是URL,第三部分为HTTP版本。request method可以有GET, PUT, POST, DELETE, HEAD。最常用的为GET和POST。GET是请求服务器发送资源给客户,POST是请求服务器接收客户送来的数据。当我们打开一个网页时,我们通常是使用GET方法;当我们填写表格并提交时,我们通常使用POST方法。第二部分为URL,它通常指向一个资源(服务器上的资源或者其它地方的资源)。像现在这样,就是指向当前服务器的当前目录的test.jpg
Accept: text/*
使用socketserve可以一次搞点所有网络的步骤SocketServer.TCPServer((HOST,PORT),MyTCPHandler)
传递给TCPServer一个MyTCPHandler类。这个类定义了如何操作socket。MyTCPHandler继承自BaseRequestHandler。改写handler()方法,来具体规定不同情况下服务器的操作.这个类是自己写的。在handler()中,通过self.request来查询通过socket进入服务器的请求 (正如我们在handler()中对socket进行recv()和sendall()操作),还使用self.address来引用socket的客户端地址。
class MyTCPHandler(SocketServer.BaseRequestHandler)

SimpleHTTPServer: 使用静态文件来回应请求

在Python中,我们可以使用SimpleHTTPServer包和CGIHTTPServer包来规定针对不同请求的操作。其中,SimpleHTTPServer可以用于处理GET方法和HEAD方法的请求。它读取request中的URL地址,找到对应的静态文件,分析文件类型,用HTTP协议将文件发送给客户.

CGIHTTPServer:使用静态文件或者CGI来回应请求

请求->URL->脚本->客户
CGI是服务器和应用脚本之间的一套接口标准它的功能是让服务器程序运行脚本程序,将程序的输出作为response发送给客户。总体的效果,是允许服务器动态的生成回复内容,而不必局限于静态文件。支持CGI的服务器程接收到客户的请求,根据请求中的URL,运行对应的脚本文件。服务器会将HTTP请求的信息和socket信息传递给脚本文件,并等待脚本的输出。脚本的输出封装成合法的HTTP回复,发送给客户。CGI可以充分发挥服务器的可编程性,让服务器变得“更聪明”。
server = BaseHTTPServer.HTTPServer((HOST,PORT),CGIHTTPServer.CGIHTTPRequestHandler)  server.serve_forever开始
CGIHTTPRequestHandler默认当前目录下的cgi-bin和ht-bin文件夹中的文件为CGI脚本,而存放于其他地方的文件被认为是静态文件。因此,我们需要修改一下index.html,将其中form元素指向的action改为cgi-bin/post.py。
<form name = "input" action = "cgi-bin/post.py" method = "post">

创建一个cgi-bin的文件夹,并在cgi-bin中放入如下post.py文件,也就是我们的CGI脚本
对于POST方法的请求,它的URL需要指向一个CGI脚本(也就是在cgi-bin或者ht-bin中的文件)。CGIHTTPRequestHandler继承自SimpleHTTPRequestHandler,所以也可以处理GET方法和HEAD方法的请求。此时,如果URL指向CGI脚本时,服务器将脚本的运行结果传送到客户端;当此时URL指向静态文件时,服务器将文件的内容传送到客户端。
0 0
原创粉丝点击