纯C++的Socket访问Http封装类
实用小技巧用socket玩转http接口
实用小技巧用socket玩转http接口一、前言曾几何时,HTTP这种应用层协议对于我来说有点高级,总觉得调用 HTTP 接口是一件很难实现的事情,需要用一个很牛逼的库才行。
直到昨天我学习了一个骚操作,原来用 socket 就可以直接玩 http,赶紧分享一波~开门见山,用socket玩转http接口就四步:•① 建立 tcp 链接;•② 发送请求数据(请求报文);•③ 接收响应数据(响应报文);•④ 关闭 tcp链接,从接收数据中提取有效信息。
接下来一步一步开始玩。
二、请求报文和响应报文1. 发送什么建立TCP 之后,要向服务器发送请求报文。
请求报文的格式非常重要,稍微偏差服务器就不认,返回一堆其它的东西,比如错误码,404 not found等。
HTTP请求报文的格式如图:(图片来源于网络)主要包括四部分:•请求行:由请求方法(GET或者POST)、URI(注意不是URL)、HTTP协议版本(HTTP/1.1)组成,中间使用空格分离,末尾换行;•请求头部:一些字段及其值,每个字段占一行;•空行:表示请求报文结束;•请求体:POST方法时需要,GET方法时不需要。
2. 接收什么HTTP 服务器收到请求报文后,会返回对应的结果,称之为响应报文:(图片来源于网络)在嵌入式设备中通常是从返回结果中提取有效信息,并且大多数API接口返回都是json数据格式,所以不用过于关心响应报文。
话不多说,直接开干!三、用网络调试助手测试1. 测试文件我在博客服务器上放置了一个txt文件用于测试,读者如有兴趣也可以使用,地址在:“/hello.txt”使用浏览器访问结果如图:2.2. 建立TCP链接使用网络助手建立TCP链接,ip地址为服务器ip,端口默认为80端口,如图:2.3. 发送请求报文根据第二节的请求报文格式+要请求的URL,组装出要发送的内容如下:GET /hello.txt HTTP/1.1HOST:2.4. 处理请求报文发出请求报文之后,服务器收到后返回的响应报文如下:HTTP/1.1 200 OKServer: nginxDate: Sun, 20 Sep 2020 11:30:32 GMTContent-Type: text/plainContent-Length: 44Last-Modified: Sat, 19 Sep 2020 14:26:02 GMTConnection: keep-aliveETag: '5f6614fa-2c'Accept-Ranges: bytesyou get success! nb! say from mculover666!至于怎么对收到的数据进行解析,这就要秀出你的字符串解析功底了,比如strstr、sscanf、使用FIFO缓冲之后解析等骚操作。
Socket和HTTP网络通信
Socket和HTTP网络通信在Android的网络通讯中,通常会使用Socket进行设备间数的数据通讯,使用Http来对网络数据进行请求。
1、Socket(套接字)不管是有过Java开发经验还是.NET开发经验的同学都应该对Socket有或多或少的了解,常见的TCP或者UDP协议其实都是基于Socket来实现的。
Socket是用于描述网络上的一个设备中的一个进程或者应用程序的,Socket由IP地址和端口号两部分组成。
IP地址用来定位设备,端口号用来定位应用程序或者进程,比如我们常见的运行在80端口上的HTTP协议。
Socket的常见格式为:192.168.1.1:1234。
那么应用程序是如何通过Socket来与网络中的其他设备进行通讯的呢?通常情况下,Socket通信有两部分,一部分为监听的Server端,一部分为主动请求连接的Client端。
Server端会一直监听Socket中的端口直到有请求为止,当Client端对该端口进行连接请求时,Server端就给予应答并返回一个Socket对象,以后在Server端与Client端的数据交换就可以使用这个Socket来进行操作了。
2、Android中使用Socket进行数据交换∙ServerSocket建立服务端(Server)时,需要使用ServerSocket对象,这个对象会自动对其构造函数中传入的端口号进行监听,并在收到连接请求后,使用ServerSocket.accept()方法返回一个连接的的Socket对象。
这个方法并不需要我们像在.NET中那样使用Start方法,它会自动进行监听的。
∙Socket不管建立客户端(Client)还是在进行其他数据交换方面的操作时,都需要使用Socket类。
Socket类在进行初始化时需要出入Server 端的IP地址和端口号,并返回连接到Server端的一个Socket对象,如果是连接失败,那么将返回异常。
C语言中的网络编程与套接字应用
C语言中的网络编程与套接字应用网络编程是计算机科学中非常重要的一个领域,而C语言是一种广泛应用于网络编程的编程语言。
在本文中,我将介绍C语言中的网络编程以及套接字的应用。
一、概述网络编程是指通过网络实现计算机之间的通信。
在C语言中,我们可以使用套接字(Socket)来进行网络编程。
套接字是一种网络通信的接口,可以用于创建网络连接、发送和接收数据等操作。
二、套接字的创建在C语言中,我们可以通过调用socket函数来创建套接字。
socket 函数接受三个参数,分别为地址域、套接字类型和协议类型。
常用的地址域有AF_INET(IPv4地址)和AF_INET6(IPv6地址),套接字类型有SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字),协议类型一般为0表示自动选择合适的协议。
三、套接字的连接一旦创建了套接字,我们就可以使用connect函数来连接到远程主机。
connect函数接受套接字描述符、远程主机的地址结构以及地址结构的长度作为参数。
连接成功后,我们便可以通过套接字进行数据的发送和接收。
四、套接字的发送与接收使用套接字进行数据的发送和接收是网络编程中的核心操作之一。
在C语言中,我们可以使用send和recv函数来实现数据的发送和接收。
send函数接受套接字描述符、数据缓冲区以及数据长度作为参数,返回发送的字节数。
recv函数同样接受套接字描述符、数据缓冲区以及数据长度作为参数,返回接收的字节数。
五、套接字的关闭在使用完套接字后,我们需要调用close函数来关闭套接字。
close函数接受套接字描述符作为参数,用于释放套接字相关的资源。
六、套接字应用实例:客户端-服务器通信下面以一个简单的客户端-服务器通信实例来说明套接字的应用。
首先,我们需要创建一个服务器程序和一个客户端程序。
服务器程序通过创建套接字、绑定地址、监听端口以及接受客户端连接的方式来进行工作。
客户端程序通过创建套接字、连接到服务器、发送和接收数据的方式来和服务器进行通信。
Socket模拟Http连接 之 初识Socket
Socket模拟Http连接之初识Socket在Symbian上使用Socket需要库的支持,即你需要引入头文件es_sock.h和esock.lib库,准备一个活动对象类,比如class SocketConnection : public CActive(1)声明RSocketServ iSocketServ;它是用来连接Symbian系统中Soket服务的类,并不是我们一般意义上的Soc ketServer,在Symbian中实现类似于Java中SocketServer功能的类实际上是RSocket。
(2)连接系统的Socket服务,即,iSocket.Connect();(3)声明RSocket对象iSocket作为一个发送请求的SocketClient。
(4)打开连接(其实只是初始化RSocket对象,并不是真的打开了连接,连地址都没给呢,它上哪打开去啊~),即iSocket.Open(iSocketServ,KAfInet,KSockStream,KProtocolInetTcp); 方法中参数含义为,#param1 已经连接成功的Socket服务对象,即(1)中提到的iSocketServ;#param2 KAfInet,代表该套接字为因特网套接字;#param3 KSoc kStream 可靠的面向连接的套接字;#param4 KProtocolInetTcp TCP控制传输协议。
(5)编写连接方法,如SocketConnect(const TDesC& aServerName,TInt aServerPort);其中#param1 主机名称;# param2 主机端口,首先判断aServerName是否为IP地址,如果是则进入连接过程,如果不是则通过DNS对主机名进行解析从而得到IP地址,无论是连接还是解析,这两个过程都是异步的,故拦截或者取得解析结果都有在RunL中完成。
C#基于Socket套接字的网络通信封装
C#基于Socket套接字的⽹络通信封装本⽂为⼤家分享了C#基于Socket套接字的⽹络通信封装代码,供⼤家参考,具体内容如下摘要之所以要进⾏Socket套接字通信库封装,主要是直接使⽤套接字进⾏⽹络通信编程相对复杂,特别对于初学者⽽⾔。
实际上微软从.net 2.0开始已经提供了TCP、UDP通信⾼级封装类如下:TcpListenerTcpClientUdpClient微软从.net 4.0开始提供基于Task任务的异步通信接⼝。
⽽直接使⽤socket封装库,很多socket本⾝的细节没办法⾃⾏控制,本⽂⽬就是提供⼀种socket的封装供参考。
⽂中展⽰部分封装了TCP通信库,UDP封装也可触类旁通:CusTcpListenerCusTcpClientTCP服务端TCP服务端封装了服务端本地绑定、监听、接受客户端连接,并提供了⽹络数据流的接⼝。
完整代码:public class CusTcpListener{private IPEndPoint mServerSocketEndPoint;private Socket mServerSocket;private bool isActive;public Socket Server{get { return this.mServerSocket; }}protected bool Active{get { return this.isActive; }}public EndPoint LocalEndpoint{get{if (!this.isActive){return this.mServerSocketEndPoint;}return this.mServerSocket.LocalEndPoint;}}public NetworkStream DataStream{get{NetworkStream networkStream = null;if (this.Server.Connected){networkStream = new NetworkStream(this.Server, true);}return networkStream;}}public CusTcpListener(IPEndPoint localEP){this.mServerSocketEndPoint = localEP;this.mServerSocket = new Socket(this.mServerSocketEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);}public CusTcpListener(string localaddr, int port){if (localaddr == null)throw new ArgumentNullException("localaddr");}this.mServerSocketEndPoint = new IPEndPoint(IPAddress.Parse(localaddr), port);this.mServerSocket = new Socket(this.mServerSocketEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); }public CusTcpListener(int port){this.mServerSocketEndPoint = new IPEndPoint(IPAddress.Any, port);this.mServerSocket = new Socket(this.mServerSocketEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); }public void Start(){this.Start(int.MaxValue);}/// <summary>/// 开始服务器监听/// </summary>/// <param name="backlog">同时等待连接的最⼤个数(半连接队列个数限制)</param>public void Start(int backlog){if (backlog > int.MaxValue || backlog < 0){throw new ArgumentOutOfRangeException("backlog");}if (this.mServerSocket == null){throw new NullReferenceException("套接字为空");}this.mServerSocket.Bind(this.mServerSocketEndPoint);this.mServerSocket.Listen(backlog);this.isActive = true;}public void Stop(){if (this.mServerSocket != null){this.mServerSocket.Close();this.mServerSocket = null;}this.isActive = false;this.mServerSocket = new Socket(this.mServerSocketEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); }public Socket AcceptSocket(){Socket socket = this.mServerSocket.Accept();return socket;}public CusTcpClient AcceptTcpClient(){CusTcpClient tcpClient = new CusTcpClient(this.mServerSocket.Accept());return tcpClient;}}TCP客户端TCP客户端封装了客户端本地绑定、连接服务器,并提供了⽹络数据流的接⼝。
C语言中的网络编程与Socket通信
C语言中的网络编程与Socket通信在计算机科学领域中,网络编程是一项重要技能,特别是当涉及到实现网络通信时。
C语言是一种广泛应用于系统编程和网络编程的编程语言,而Socket通信则是C语言中实现网络通信的一种常用方法。
本文将探讨C语言中的网络编程以及如何使用Socket进行通信。
一、网络编程概述网络编程是指通过计算机网络进行数据传输和通信的技术。
在网络编程中,客户端和服务器通常通过套接字(Socket)进行连接和通信。
套接字是一种抽象的概念,它包括IP地址和端口号,用于标识网络上的进程。
二、Socket通信Socket通信是网络编程中最常用的通信方式之一,它基于套接字的概念。
在C语言中,可以通过socket()函数创建一个套接字,然后使用connect()函数连接到服务器或使用bind()函数将套接字绑定到特定的IP 地址和端口号。
一旦建立了连接,就可以使用send()和recv()函数进行数据的发送和接收。
三、TCP/IP协议在网络编程中,TCP/IP协议是最常用的网络协议之一。
TCP(传输控制协议)提供可靠的面向连接的通信,而IP(Internet协议)则负责数据包的传输。
使用TCP/IP协议进行网络编程时,C语言中的Socket 通信是一种常见的实现方式。
四、Socket编程步骤下面是在C语言中进行Socket编程的一般步骤:1. 创建套接字:使用socket()函数创建一个套接字。
2. 绑定套接字:使用bind()函数将套接字绑定到特定的IP地址和端口号。
3. 监听连接请求:对于服务器端程序,使用listen()函数监听客户端连接请求。
4. 接受连接:使用accept()函数接受客户端的连接请求。
5. 进行通信:一旦连接建立,使用send()和recv()函数进行数据的发送和接收。
6. 关闭套接字:通信结束后,使用close()函数关闭套接字。
五、示例代码下面是一个简单的C语言示例代码,演示了如何使用Socket进行客户端和服务器端的通信:服务器端代码:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>int main() {int sockfd, newsockfd, portno, clilen;char buffer[256];struct sockaddr_in serv_addr, cli_addr;int n;sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("ERROR opening socket");exit(1);}bzero((char *) &serv_addr, sizeof(serv_addr));portno = 1234;serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = INADDR_ANY;serv_addr.sin_port = htons(portno);if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {perror("ERROR on binding");exit(1);}listen(sockfd, 5);clilen = sizeof(cli_addr);newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0) {perror("ERROR on accept");exit(1);}bzero(buffer, 256);n = read(newsockfd, buffer, 255);if (n < 0) {perror("ERROR reading from socket");exit(1);}printf("Here is the message: %s\n", buffer);n = write(newsockfd, "I got your message", 18);if (n < 0) {perror("ERROR writing to socket"); exit(1);}close(newsockfd);close(sockfd);return 0;}客户端代码:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>int main() {int sockfd, portno, n;struct sockaddr_in serv_addr;struct hostent *server;char buffer[256];portno = 1234;sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("ERROR opening socket");exit(1);}server = gethostbyname("localhost");if (server == NULL) {fprintf(stderr, "ERROR, no such host\n");exit(0);}bzero((char *) &serv_addr, sizeof(serv_addr));serv_addr.sin_family = AF_INET;bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);serv_addr.sin_port = htons(portno);if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {perror("ERROR connecting");exit(1);}printf("Please enter the message: ");bzero(buffer, 256);fgets(buffer, 255, stdin);n = write(sockfd, buffer, strlen(buffer)); if (n < 0) {perror("ERROR writing to socket");exit(1);}bzero(buffer, 256);n = read(sockfd, buffer, 255);if (n < 0) {perror("ERROR reading from socket"); exit(1);}printf("%s\n", buffer);close(sockfd);return 0;}六、总结C语言中的网络编程与Socket通信为实现网络通信提供了一种有效而强大的方式。
socket,实现http协议
socket,实现http协议篇一:用Socket类实现HTTP协议客户端应用用Socket类实现HTTP协议客户端应用Http客户端程序已集成在Java语言中,可以通过URLConnection类调用。
遗憾的是,由于SUN没有公布Http客户程序的源码,它实现的细节仍是一个谜。
本文根据HTTP 协议规范,用.Socket类实现一个HTTP协议客户端程序。
1.Socket类:了解TCP/IP协议集通信的读者知道,协议间的通信是通过Socket完成的。
在包中,Socket类就是对Socket的具体实现。
它通过连接到主机后,返回一个I/O流,实现协议间的信息交换。
2 . HTTP协议HTTP协议同其它TCP/IP协议集中的协议一样,是遵循客户/服务器模型工作的。
客户端发往服务端的信息格式如下: ------------------------------请求方法URL HTTP协议的版本号提交的元信息**空行**实体------------------------------请求方法是对这次连接工作的说明,目前HTTP协议已经发展到1.1版,它包括GET、HEAD、POST、DELETE、OPTIONS、TRACE、PUT 七种。
元信息是关于当前请求的信息。
通过分析元信息,可以检查实体数据是否完整,接收过程是否出错,类型是否匹配等。
元信息的引入使HTTP协议通信更加稳妥可靠。
实体是请求的具体内容。
将上述报文发往Web服务器,如果成功,应答格式如下:--------------------------------HTTP协议的版本号应答状态码应答状态码说明接收的元信息**空行**实体--------------------------------以上报文发向客户端,并且接收成功,彼此间关闭连接,完成一次握手。
下面用最常用的GET方法,来说明具体的报文应用----------------------------------GET HTTP/1.0 accept: www/source; text/html; image/gif; image/jpeg; */* User_Agent: myAgent**空行**-----------------------------------这个报文是向主机请求一个缺省HTML文档。
C++简单封装socket类包含TCP和UDP基本通信能力
C++简单封装socket类包含TCP和UDP基本通信能⼒类名:TSocket⽂件包含:TSocket.cpp、TSocket.h使⽤⽅法:1、在对话框头⽂件包含TSocket.h#include "TSocket.h"2、定义变量TSocket m_TSocket;3、TSocket类函数功能介绍:LoadSocket():加载SOCKET库CreateSocketSer(TRUE):创建SOCKET,TRUE为TCP,FALSE为UDPBingSocket():绑定IP和端⼝,有默认值Start(precvPar):precvPar为⼀个RECVPARAM结构体指针SendData(strSend):发送数据函数4、服务端处理接收到的数据(消息映射、路由)afx_msg void OnRecvData(WPARAM wParam,LPARAM lParam);ON_MESSAGE(WM_RECVDATA,OnRecvData)void CXXXDlg::OnRecvData( WPARAM wParam,LPARAM lParam ){CString strrecv = (char*)lParam;//得到消息内容}5、稳定性不能保证,仅供参考socket通信原理。
****************************************TSocket.h*****************************************// TSocket.h: interface for the TSocket class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_TSOCKET_H__ECFF7A02_DCAF_455D_97C3_0C1D465D977B__INCLUDED_)#define AFX_TSOCKET_H__ECFF7A02_DCAF_455D_97C3_0C1D465D977B__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include#pragma comment(lib,"ws2_32.lib")#define WM_RECVDATA WM_USER+500 //定义接收到数据发出的消息号#define MAX_MSG_LEN 1500 //最⼤的消息长度(MTU)#define DEFAULTPORT 1991 //定义默认服务端⼝class TSocket;struct RECVPARAM{TSocket* psocket;//指定创建的socketHWND hwnd;//指定需要处理接收消息的窗⼝句柄};class TSocket{public:TSocket();virtual ~TSocket();public://加载Winsock库BOOL LoadSocket();BOOL CreateSocketSer(BOOL bMode);//创建socket⽤于服务器端SOCKET CreateSocket(BOOL bMode);//创建socket⽤于客户端BOOL BingSocket(u_long ulIP=0,u_short usPort=DEFAULTPORT);//绑定端⼝、IP(默认所有IP) BOOL Start(RECVPARAM* recvPar);BOOL Stop();SOCKET GetSocket();//得到当前socketCString m_strData;//发出去的数据BOOL m_bIsRun; //是否继续运⾏u_long m_ulLocalIP;//本地IPu_short m_usLocalPort;//本地端⼝u_long m_ulRemoteIP;//远程IPu_short m_usRemotePort;//远程端⼝//发送数据DWORD SendData(CString strSend);//TCP发送线程static DWORD WINAPI TcpSendProc(LPVOID lpParameter);//UDP发送线程static DWORD WINAPI UdpSendProc(LPVOID lpParameter);//TCP发送数据DWORD TcpSend();//UDP发送数据DWORD UdpSend();private:BOOL m_bMode; //通信⽅式 1--TCP 0--UDPSOCKET m_socket;//套接字HANDLE m_hRecv; //接收线程的句柄//TCP接收线程static DWORD WINAPI TcpRecvProc(LPVOID lpParameter);//UDP接收线程static DWORD WINAPI UdpRecvProc(LPVOID lpParameter);};#endif // !defined(AFX_TSOCKET_H__ECFF7A02_DCAF_455D_97C3_0C1D465D977B__INCLUDED_) ****************************************TSocket.h*********************************************************************************TSocket.cpp*****************************************// TSocket.cpp: implementation of the TSocket class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "TSocket.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////TSocket::TSocket()m_bMode = FALSE;//UDPm_ulRemoteIP = 0;m_ulLocalIP = 0;}TSocket::~TSocket(){//释放Winsock库WSACleanup();}BOOL TSocket::LoadSocket(){//加载Winsock库WSADATA wsa;if (WSAStartup(MAKEWORD(1,1),&wsa) != 0){return FALSE; //加载失败}return TRUE;}BOOL TSocket::CreateSocketSer(BOOL bMode){m_bMode = bMode;//创建SOCKETif (m_bMode){m_socket = socket(AF_INET,SOCK_STREAM,0);//TCP流式}else{m_socket = socket(AF_INET,SOCK_DGRAM,0);//UDP⽅式}return TRUE;}SOCKET TSocket::CreateSocket( BOOL bMode ){m_bMode = bMode;SOCKET socketCr;//创建SOCKETif (m_bMode){socketCr = socket(AF_INET,SOCK_STREAM,0);//TCP⽅式}else{socketCr = socket(AF_INET,SOCK_DGRAM,0);//UDP⽅式}return socketCr;}BOOL TSocket::BingSocket(u_long ulIP,u_short usPort){//配置监听地址、绑定监听端⼝SOCKADDR_IN Sersock;//⽤于服务器的监听SOCKET ZeroMemory(&Sersock,sizeof(Sersock));if(ulIP==0){Sersock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);}else{Sersock.sin_addr.S_un.S_addr = htonl(ulIP);//IP}Sersock.sin_family = AF_INET;Sersock.sin_port = htons(usPort);//端⼝号int nbind = bind(m_socket,(SOCKADDR *)&Sersock,sizeof(SOCKADDR));if (SOCKET_ERROR==nbind){closesocket(m_socket);return FALSE;}return TRUE;}DWORD WINAPI TSocket::TcpRecvProc( LPVOID lpParameter ){TSocket* psocket = ((RECVPARAM *)lpParameter)->psocket;HWND hwnd = ((RECVPARAM *)lpParameter)->hwnd;delete lpParameter;//释放内存listen(psocket->m_socket,5);SOCKADDR_IN addrClient;int len=sizeof(SOCKADDR);char szrecvbuf[MAX_MSG_LEN];char szsendBuf[50];ZeroMemory(szrecvbuf,sizeof(szrecvbuf));ZeroMemory(szsendBuf,sizeof(szsendBuf));SOCKET sockSer;while(psocket->m_bIsRun){//⽤accept函数接收客户⽅的连接sockSer=accept(psocket->m_socket,(SOCKADDR*)&addrClient,&len);if (INVALID_SOCKET==sockSer)continue;sprintf(szsendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));//在客户⽅套接字clientSocket上使⽤send发送数据send(sockSer,szsendBuf,strlen(szsendBuf)+1,0);//接收的数据recv(sockSer,szrecvbuf,50,0);psocket->m_strData.Format(_T("IP:%s,端⼝:%d 说:%s"),inet_ntoa(addrClient.sin_addr),addrClient.sin_port,szrecvbuf);::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)psocket->m_strData.GetBuffer(0)); //关闭本次连接closesocket(sockSer);//休息100SSleep(100);}//关闭socketclosesocket(psocket->m_socket);return 0;}DWORD WINAPI TSocket::UdpRecvProc( LPVOID lpParameter ){TSocket* psocket = ((RECVPARAM *)lpParameter)->psocket;HWND hwnd = ((RECVPARAM *)lpParameter)->hwnd;delete lpParameter;//释放内存SOCKADDR_IN sockRecv;int nlen = sizeof(SOCKADDR);char szrecvbuf[MAX_MSG_LEN];ZeroMemory(szrecvbuf,sizeof(szrecvbuf));int nrecv;while (psocket->m_bIsRun){nrecv=recvfrom(psocket->m_socket,szrecvbuf,sizeof(szrecvbuf),0,(SOCKADDR *)&sockRecv,&nlen); if (SOCKET_ERROR == nrecv)break;psocket->m_strData.Format(_T("IP:%s,端⼝:%d 说:%s"),inet_ntoa(sockRecv.sin_addr),sockRecv.sin_port,szrecvbuf);::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)psocket->m_strData.GetBuffer(0));//休息100SSleep(1000);}//关闭socketclosesocket(psocket->m_socket);CloseHandle(psocket->m_hRecv);return 0;}BOOL TSocket::Start( RECVPARAM* recvPar ){m_bIsRun = TRUE;//创建接收消息的线程if (m_bMode){m_hRecv = CreateThread(NULL,0,TcpRecvProc,(LPVOID)recvPar,0,NULL);}else{m_hRecv = CreateThread(NULL,0,UdpRecvProc,(LPVOID)recvPar,0,NULL);}return TRUE;}BOOL TSocket::Stop(){//Kill线程if (m_hRecv!=NULL){TerminateThread(m_hRecv,0);//关闭socketclosesocket(m_socket);}m_bIsRun = FALSE;return TRUE;}DWORD TSocket::TcpSend(){if (m_ulRemoteIP==0)return -1;SOCKET SocketSend;SocketSend=CreateSocket(TRUE);if (SocketSend==INVALID_SOCKET)return -1;}SOCKADDR_IN SocketSendIn;SocketSendIn.sin_family = AF_INET;SocketSendIn.sin_addr.S_un.S_addr = htonl(m_ulRemoteIP);SocketSendIn.sin_port = htons(m_usRemotePort);char szBuf[50];//先建⽴连接int nRet = connect(SocketSend,(SOCKADDR*)&SocketSendIn,sizeof(SOCKADDR));if (nRet==SOCKET_ERROR){return -1;}nRet = recv(SocketSend,szBuf,sizeof(szBuf),0);if (nRet==0)//超时{return -2;}//开始发送数据send(SocketSend,m_strData.GetBuffer(0),m_strData.GetLength(),0);closesocket(SocketSend);return 0;}DWORD TSocket::UdpSend(){if (m_ulRemoteIP==0)return -1;SOCKET SocketSend;SocketSend=CreateSocket(FALSE);if (SocketSend==INVALID_SOCKET){return -1;}SOCKADDR_IN SocketSendIn;SocketSendIn.sin_family = AF_INET;SocketSendIn.sin_addr.S_un.S_addr = htonl(m_ulRemoteIP);SocketSendIn.sin_port = htons(m_usRemotePort);int nSenlen=m_strData.GetLength()+1;sendto(SocketSend,m_strData,nSenlen,0,(SOCKADDR *)&SocketSendIn,sizeof(SOCKADDR)); closesocket(SocketSend);return 0;}DWORD TSocket::SendData( CString strSend ){//保存数据m_strData = strSend;if (m_bMode){CreateThread(NULL,0,TcpSendProc,(LPVOID)this,0,NULL);}else{CreateThread(NULL,0,UdpSendProc,(LPVOID)this,0,NULL);}return 0;}SOCKET TSocket::GetSocket(){return m_socket;}DWORD WINAPI TSocket::TcpSendProc( LPVOID lpParameter ) {TSocket* pThis = (TSocket*)lpParameter;return pThis->TcpSend();}DWORD WINAPI TSocket::UdpSendProc( LPVOID lpParameter ) {TSocket* pThis = (TSocket*)lpParameter;return pThis->UdpSend();}****************************************TSocket.cpp*************。
C语言socket编程使用方法简介
C语言socket编程使用方法简介C语言socket编程使用方法简介第一部分服务器端一、创建服务器套接字(create)。
二、服务器套接字进行信息绑定(bind),并开始监听连接(listen)。
三、接受来自用户端的连接请求(accept)。
四、开始数据传输(send/receive)。
五、关闭套接字(closesocket)。
socket接收、发送代码1 SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);2 char sendBuf[50];3 sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));4 send(sockConn,sendBuf,strlen(sendBuf)+1,0);5 char recvBuf[50];6 recv(sockConn,recvBuf,50,0);7 printf("%s ",recvBuf);8 closesocket(sockConn);第二部分用户端一、创建用户套接字(create)。
二、与远程服务器进行连接(connect),如被接受则创建接收进程。
三、开始数据传输(send/receive)。
四、关闭套接字(closesocket)。
客户端代码1 SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);2 printf("%s ",recvBuf);3 SOCKADDR_IN addrSrv;4 addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");5 addrSrv.sin_family=AF_INET;6 addrSrv.sin_port=htons(6000);7connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));8 send(sockClient,"hello",strlen("hello")+1,0);9 char recvBuf[50];10 recv(sockClient,recvBuf,50,0);服务器端代码和客户端主要代码基本上都是上面的`程序,在应用的过程中有几点要根据自己的需求更改,1、127.0.0.1是服务器端的IP地址,根据自己的IP段进行修改;2、htons(6000)是端口号根据具体设定进行修改,我们PLC端口号用到是9600,这点我们需要修改成9600。
linux c socket 内核实现原理
linux c socket 内核实现原理Linux 的套接字(socket)是一种网络编程接口,用于实现进程之间的通信。
它在内核中的实现原理如下:1. 创建套接字:当一个进程调用 socket() 系统调用时,内核会在进程的文件描述符表中创建一个新的文件描述符,并返回该文件描述符给进程。
2. 设置套接字选项:进程可以调用 setsockopt() 系统调用来设置套接字的一些参数和选项,例如设置套接字为非阻塞模式,设置接收缓冲区大小等。
3. 绑定套接字:进程可以调用 bind() 系统调用来将套接字与一个本地的 IP 地址和端口绑定。
4. 监听连接请求:对于 TCP 套接字,进程可以调用 listen() 系统调用来监听连接请求,内核会为套接字创建一个连接请求队列,并将进来的连接请求放在队列中等待处理。
5. 接收连接请求:进程可以调用 accept() 系统调用来接受一个连接请求,内核会从连接请求队列中取出一个连接请求,并创建一个新的套接字用于和客户端进行通信,并返回该新套接字的文件描述符给进程。
6. 建立连接:对于 TCP 套接字,当 accept() 返回之后,内核会自动完成 TCP 的三次握手过程,与客户端建立起连接。
7. 发送和接收数据:进程可以使用 send() 和 recv() 系统调用来分别发送和接收数据。
当进程调用 send() 发送数据时,内核会将数据从进程的用户空间拷贝到发送缓冲区,并将数据通过网络发送出去。
当进程调用 recv() 接收数据时,内核会将接收到的数据从接收缓冲区拷贝到进程的用户空间。
8. 关闭连接:进程可以调用 close() 系统调用来关闭套接字,内核会释放套接字所占用的资源。
总的来说,Linux的套接字实现主要依靠内核中的网络协议栈,使用一系列的数据结构和算法来完成数据的传输和通信。
其中,内核负责管理套接字的创建、绑定、监听、接受连接请求等操作,以及数据的发送和接收。
C#中经常用到的HTTP请求类,已封装get,post,delete,put
请求出错错误代码400请尝试刷新页面重试
C#中经常用到的 HTTP请求类,已封装 get,post, delete,put
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ; using System.IO; using System.Web; namespace WebAPIClientDemo {
return CommonHttpRequest(data, uri, "DELETE"); }
public string Delete(string uri) {
//Web访问对象64 string serviceUrl = string.Format("{0}/{1}", this.BaseUri, uri); HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(serviceUrl); myRequest.Method = "DELETE"; // 获得接口返回值68 HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse(); StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8); //string ReturnXml = HttpUtility.UrlDecode(reader.ReadToEnd()); string ReturnXml = reader.ReadToEnd(); reader.Close(); myResponse.Close(); return ReturnXml; } #endregion
VC++使用CSocket发送HTTPRequest时需要注意发送数据的编码格式
VC++使⽤CSocket发送HTTPRequest时需要注意发送数据的编
码格式
VS2010以及更⾼版本中新建的MFC项⽬字符集默认是Unicode,CString创建的字符串默认是Unicode。
使⽤CSocket时,若以CString组织需要发送的HTTP Head时,那么服务器不会接受这种数据,会强制断开连接。
HTTP服务器的默认读取⽅式是基于char type的单字节字符串编码(ANSI-1Byte(8bit)/char(英⽂字符)),⽽Unicode是以2Byte(16bit)/char 存储的,所以不能以unicode编码来构造HTTP Head.
解决⽅法有两种,第⼀种:
以CStringA class构造HTTP Head;
根据MSDN上的解释:“A CStringA object contains string data that is based on the char type, and supports single-byte and multibyte ( MBCS) strings. ”
所以直接⽤CStringA构造HTTP Head是可以的。
第⼆种:
先将Unicode编码的字符串转化成单字节的ASCII,再调⽤发送给服务器。
c#使用Socket发送HTTPHTTPS请求的实现代码
c#使⽤Socket发送HTTPHTTPS请求的实现代码C# ⾃带的HttpWebRequest效率太低,对于⾃组HTTP封包不好操作。
在写超级SQL注⼊⼯具时,研究了很长⼀段时间如何使⽤Socket来发送HTTP、HTTPS请求。
经过⼀年的修改和测试,可完美、⾼效发送并解析HTTP/HTTPS请求。
修改过⽆数次bug。
在这⾥把核⼼代码分享出来,供⼤家学习或做开发参考。
⽤这个代码写了⼀个简单的HTTP发包⼯具。
供⼤家参考。
⼯具下载:核⼼类:HTTP.csusing System;using System.Collections.Generic;using System.Text;using tools;using ;using .Sockets;using pression;using System.IO;using .Security;using System.Text.RegularExpressions;using System.Threading;using System.Diagnostics;using System.Security.Authentication;using System.Security.Cryptography.X509Certificates;using HTTPTool;namespace tools{public class HTTP{public const char T = '';public const String CT = "";public const String CTRL = "";public const String Content_Length_Str = "content-length: ";public const String Content_Length_Str_M = "Content-Length: ";public const String Content_Length = "content-length";public const String Content_Encoding = "content-encoding";public const String Transfer_Encoding = "transfer-encoding";public const String Connection = "connection";public static Main main = null;public static long index = 0;public void initMain(Main m){main = m;}/***发⽣异常尝试重连**/public static ServerInfo sendRequestRetry(Boolean isSSL, int tryCount, String host, int port, String payload, String request, int timeout, String encoding, Boolean foward_302) {int count = 0;Interlocked.Increment(ref index);ServerInfo server = new ServerInfo();timeout = timeout * 1000;while (true){if (count >= tryCount) break;try{if (!isSSL){server = sendHTTPRequest(count, host, port, payload, request, timeout, encoding, foward_302);return server;}else{server = sendHTTPSRequest(count, host, port, payload, request, timeout, encoding, foward_302);return server;}}catch (Exception e){Tools.SysLog("发包发⽣异常,正在重试----" + e.Message);server.timeout = true;continue;}finally{count++;}}return server;}private static void checkContentLength(ref ServerInfo server, ref String request){//重新计算并设置Content-lengthint sindex = request.IndexOf(CTRL);server.reuqestHeader = request;if (sindex != -1){server.reuqestHeader = request.Substring(0, sindex);server.reuqestBody = request.Substring(sindex + 4, request.Length - sindex - 4);int contentLength = Encoding.UTF8.GetBytes(server.reuqestBody).Length;String newContentLength = Content_Length_Str_M + contentLength;if (request.IndexOf(Content_Length_Str_M) != -1){request = Regex.Replace(request, Content_Length_Str_M + "d+", newContentLength);}else{request = request.Insert(sindex, "" + newContentLength);}}else{request = Regex.Replace(request, Content_Length_Str + "d+", Content_Length_Str_M + "0");request += CTRL;}}private static void doHeader(ref ServerInfo server, ref String[] headers){for (int i = 0; i < headers.Length; i++){if (i == 0){server.code = Tools.convertToInt(headers[i].Split(' ')[1]);}else{String[] kv = Regex.Split(headers[i], ": ");String key = kv[0].ToLower();if (!server.headers.ContainsKey(key)){//⾃动识别编码if ("content-type".Equals(key)){String hecnode = getHTMLEncoding(kv[1], "");if (!String.IsNullOrEmpty(hecnode)){server.encoding = hecnode;}}if (kv.Length > 1){server.headers.Add(key, kv[1]);}else{server.headers.Add(key, "");}}}}}private static ServerInfo sendHTTPRequest(int count, String host, int port, String payload, String request, int timeout, String encoding, Boolean foward_302) {String index = + HTTP.index;Stopwatch sw = new Stopwatch();sw.Start();ServerInfo server = new ServerInfo();TcpClient clientSocket = null;int sum = 0;try{if (port > 0 && port <= 65556){//编码处理server.request = request;TimeOutSocket tos = new TimeOutSocket();clientSocket = tos.Connect(host, port, timeout);if (sw.ElapsedMilliseconds >= timeout){return server;}clientSocket.SendTimeout = timeout - eTime;if (clientSocket.Connected){checkContentLength(ref server, ref request);server.request = request;byte[] requestByte = Encoding.UTF8.GetBytes(request);clientSocket.Client.Send(requestByte);byte[] responseBody = new byte[1024 * 1000];int len = 0;//获取header头String tmp = "";StringBuilder sb = new StringBuilder();clientSocket.ReceiveTimeout = timeout - (int)sw.ElapsedMilliseconds;do{byte[] responseHeader = new byte[1];len = clientSocket.Client.Receive(responseHeader, 1, SocketFlags.None);if (len == 1){char c = (char)responseHeader[0];sb.Append(c);if (c.Equals(T)){tmp = String.Concat(sb[sb.Length - 4], sb[sb.Length - 3], sb[sb.Length - 2], c);}}} while (!tmp.Equals(CTRL) && sw.ElapsedMilliseconds < timeout);server.header = sb.ToString().Replace(CTRL, "");String[] headers = Regex.Split(server.header, CT);if (headers != null && headers.Length > 0){//处理headerdoHeader(ref server, ref headers);//⾃动修正编码if (!String.IsNullOrEmpty(server.encoding)){encoding = server.encoding;}Encoding encod = Encoding.GetEncoding(encoding);//302 301跳转if ((server.code == 302 || server.code == 301) && foward_302){StringBuilder rsb = new StringBuilder(server.request);int urlStart = server.request.IndexOf(" ") + 1;int urlEnd = server.request.IndexOf(" HTTP");if (urlStart != -1 && urlEnd != -1){String url = server.request.Substring(urlStart, urlEnd - urlStart);rsb.Remove(urlStart, url.Length);String location = server.headers["location"];if (!server.headers["location"].StartsWith("/") && !server.headers["location"].StartsWith("http")) {location = Tools.getCurrentPath(url) + location;}rsb.Insert(urlStart, location);return sendHTTPRequest(count, host, port, payload, rsb.ToString(), timeout, encoding, false); }}//根据请求头解析if (server.headers.ContainsKey(Content_Length)){int length = int.Parse(server.headers[Content_Length]);while (sum < length && sw.ElapsedMilliseconds < timeout){int readsize = length - sum;len = clientSocket.Client.Receive(responseBody, sum, readsize, SocketFlags.None);if (len > 0){sum += len;}}}//解析chunked传输else if (server.headers.ContainsKey(Transfer_Encoding)){//读取长度int chunkedSize = 0;byte[] chunkedByte = new byte[1];//读取总长度sum = 0;do{String ctmp = "";do{len = clientSocket.Client.Receive(chunkedByte, 1, SocketFlags.None);ctmp += Encoding.UTF8.GetString(chunkedByte);} while ((ctmp.IndexOf(CT) == -1) && (sw.ElapsedMilliseconds < timeout));chunkedSize = Tools.convertToIntBy16(ctmp.Replace(CT, ""));//chunked的结束0是结束标志,单个chunked块结束if (ctmp.Equals(CT)){continue;}if (chunkedSize == 0){//结束了break;}int onechunkLen = 0;while (onechunkLen < chunkedSize && sw.ElapsedMilliseconds < timeout){len = clientSocket.Client.Receive(responseBody, sum, chunkedSize - onechunkLen, SocketFlags.None);if (len > 0){onechunkLen += len;sum += len;}}//判断} while (sw.ElapsedMilliseconds < timeout);}//connection close⽅式或未知body长度else{while (sw.ElapsedMilliseconds < timeout){if (clientSocket.Client.Poll(timeout, SelectMode.SelectRead)){if (clientSocket.Available > 0){len = clientSocket.Client.Receive(responseBody, sum, (1024 * 200) - sum, SocketFlags.None);if (len > 0){sum += len;}}else{break;}}}}//判断是否gzipif (server.headers.ContainsKey(Content_Encoding)){server.body = unGzip(responseBody, sum, encod);}else{server.body = encod.GetString(responseBody, 0, sum);}}}}}catch (Exception e){Exception ee = new Exception("HTTP发包错误!错误消息:" + e.Message + + "----发包编号:" + index);throw ee;}finally{sw.Stop();server.length = sum;server.runTime = (int)sw.ElapsedMilliseconds;if (clientSocket != null){clientSocket.Close();}}return server;}private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors){return true;}private static ServerInfo sendHTTPSRequest(int count, String host, int port, String payload, String request, int timeout, String encoding, Boolean foward_302) {String index = + HTTP.index;Stopwatch sw = new Stopwatch();sw.Start();ServerInfo server = new ServerInfo();int sum = 0;TcpClient clientSocket = null; ;try{if (port > 0 && port <= 65556){TimeOutSocket tos = new TimeOutSocket();clientSocket = tos.Connect(host, port, timeout);if (sw.ElapsedMilliseconds >= timeout){return server;}clientSocket.SendTimeout = timeout - eTime;SslStream ssl = null;if (clientSocket.Connected){ssl = new SslStream(clientSocket.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate)); SslProtocols protocol = SslProtocols.Ssl3 | SslProtocols.Ssl2 | SslProtocols.Tls;ssl.AuthenticateAsClient(host, null, protocol, false);if (ssl.IsAuthenticated){checkContentLength(ref server, ref request);server.request = request;byte[] requestByte = Encoding.UTF8.GetBytes(request);ssl.Write(requestByte);ssl.Flush();}}server.request = request;byte[] responseBody = new byte[1024 * 1000];int len = 0;//获取header头String tmp = "";StringBuilder sb = new StringBuilder();StringBuilder bulider = new StringBuilder();clientSocket.ReceiveTimeout = timeout - (int)sw.ElapsedMilliseconds;do{byte[] responseHeader = new byte[1];int read = ssl.ReadByte();char c = (char)read;sb.Append(c);if (c.Equals(T)){tmp = String.Concat(sb[sb.Length - 4], sb[sb.Length - 3], sb[sb.Length - 2], c);}} while (!tmp.Equals(CTRL) && sw.ElapsedMilliseconds < timeout);server.header = sb.ToString().Replace(CTRL, "");String[] headers = Regex.Split(server.header, CT);//处理headerdoHeader(ref server, ref headers);//⾃动修正编码if (!String.IsNullOrEmpty(server.encoding)){encoding = server.encoding;}Encoding encod = Encoding.GetEncoding(encoding);//302 301跳转if ((server.code == 302 || server.code == 301) && foward_302){int urlStart = server.request.IndexOf(" ");int urlEnd = server.request.IndexOf(" HTTP");if (urlStart != -1 && urlEnd != -1){String url = server.request.Substring(urlStart + 1, urlEnd - urlStart - 1);if (!server.headers["location"].StartsWith("/") && !server.headers["location"].StartsWith("https")){server.request = server.request.Replace(url, Tools.getCurrentPath(url) + server.headers["location"]);}else{server.request = server.request.Replace(url, server.headers["location"]);}return sendHTTPSRequest(count, host, port, payload, server.request, timeout, encoding, false);}}//根据请求头解析if (server.headers.ContainsKey(Content_Length)){int length = int.Parse(server.headers[Content_Length]);while (sum < length && sw.ElapsedMilliseconds < timeout){len = ssl.Read(responseBody, sum, length - sum);if (len > 0){sum += len;}}}//解析chunked传输else if (server.headers.ContainsKey(Transfer_Encoding)){//读取长度int chunkedSize = 0;byte[] chunkedByte = new byte[1];//读取总长度sum = 0;do{String ctmp = "";do{len = ssl.Read(chunkedByte, 0, 1);ctmp += Encoding.UTF8.GetString(chunkedByte);} while (ctmp.IndexOf(CT) == -1 && sw.ElapsedMilliseconds < timeout); chunkedSize = Tools.convertToIntBy16(ctmp.Replace(CT, ""));//chunked的结束0是结束标志,单个chunked块结束if (ctmp.Equals(CT)){continue;}if (chunkedSize == 0){//结束了break;}int onechunkLen = 0;while (onechunkLen < chunkedSize && sw.ElapsedMilliseconds < timeout) {len = ssl.Read(responseBody, sum, chunkedSize - onechunkLen);if (len > 0){onechunkLen += len;sum += len;}}//判断} while (sw.ElapsedMilliseconds < timeout);}//connection close⽅式或未知body长度else{while (sw.ElapsedMilliseconds < timeout){if (clientSocket.Client.Poll(timeout, SelectMode.SelectRead)){if (clientSocket.Available > 0){len = ssl.Read(responseBody, sum, (1024 * 200) - sum);if (len > 0){sum += len;}}else{break;}}}}//判断是否gzipif (server.headers.ContainsKey(Content_Encoding)){server.body = unGzip(responseBody, sum, encod);}else{server.body = encod.GetString(responseBody, 0, sum);}catch (Exception e){Exception ee = new Exception("HTTPS发包错误!错误消息:" + e.Message + "----发包编号:" + index); throw ee;}finally{sw.Stop();server.length = sum;server.runTime = (int)sw.ElapsedMilliseconds;if (clientSocket != null){clientSocket.Close();}}return server;}public static String unGzip(byte[] data, int len, Encoding encoding){String str = "";MemoryStream ms = new MemoryStream(data, 0, len);GZipStream gs = new GZipStream(ms, CompressionMode.Decompress);MemoryStream outbuf = new MemoryStream();byte[] block = new byte[1024];try{while (true){int bytesRead = gs.Read(block, 0, block.Length);if (bytesRead <= 0){break;}else{outbuf.Write(block, 0, bytesRead);}}str = encoding.GetString(outbuf.ToArray());}catch (Exception e){Tools.SysLog("解压Gzip发⽣异常----" + e.Message);}finally{outbuf.Close();gs.Close();ms.Close();}return str;}public static String getHTMLEncoding(String header, String body){if (String.IsNullOrEmpty(header) && String.IsNullOrEmpty(body)){return "";}body = body.ToUpper();Match m = Regex.Match(header, @"charsets*=s*""?(?<charset>[^""]*)", RegexOptions.IgnoreCase);if (m.Success){return m.Groups["charset"].Value.ToUpper();}else{if (String.IsNullOrEmpty(body)){return "";}m = Regex.Match(body, @"charsets*=s*""?(?<charset>[^""]*)", RegexOptions.IgnoreCase);if (m.Success){return m.Groups["charset"].Value.ToUpper();}}return "";以上就是关于c# Socket发送HTTP/HTTPS请求的核⼼代码了,需要的朋友可以参考⼀下。
c语言socket函数
c语言socket函数
在C语言中,socket库提供了用于网络编程的函数。
以下是一些常用的函数:
1. socket()函数:创建一个新的套接字,该函数有三个参数,分别为协议域(AF_INET代表IPv4协议)、套接字类型(SOCK_STREAM代表流式套接字,SOCK_DGRAM代表数据报套接字)和协议编号(0代表按默认协议)。
2. bind()函数:将套接字与一个本地端口号绑定,该函数有三个参数,分别为套接字文件描述符、本地地址指针以及地址结构体的大小。
3. listen()函数:将套接字设置为监听模式,该函数有两个参数,分别为套接字文件描述符和请求等待队列的最大长度。
4. accept()函数:接受连接请求,返回一个新的对等套接字文件描述符,该函数有三个参数,分别为监听套接字文件描述符、客户端地址信息指针以及客户端地址长度。
5. connect()函数:建立连接,该函数有三个参数,分别为套接字文件描述符、服务器地址指针以及服务器地址结构体的大小。
6. send()函数:向对等端发送数据,该函数有四个参数,分别为套接字文件描述符、数据缓冲区起始地址、数据长度以及标志位。
7. recv()函数:接收对等端发送的数据,该函数有四个参数,分别为套接字文件描述符、数据缓冲区起始地址、数据长度以及标志位。
8. close()函数:关闭套接字,该函数有一个参数,为套接字文件描述符。
以上是常用的socket函数,还有其他一些函数供网络编程使用。
c语言面试题 socket通信过程
c语言面试题socket通信过程在C语言中,Socket通信是一种通过网络进行进程间通信(IPC)的方式。
以下是Socket 通信的基本过程:1. 创建Socket:首先,需要创建一个Socket。
这通常通过调用`socket()`函数来完成,该函数返回一个文件描述符,该文件描述符可以用于后续的I/O操作。
2. 绑定Socket:接下来,需要将Socket绑定到一个特定的地址和端口上。
这通过调用`bind()`函数来完成。
`bind()`函数需要三个参数:一个指向`sockaddr`结构的指针,该结构包含了要绑定的地址和端口信息;一个整数,表示地址族(例如,AF_INET表示IPv4);以及一个整数,表示Socket的类型(例如,SOCK_STREAM表示TCP)。
3. 监听连接:一旦Socket被绑定,就可以开始监听连接了。
这通过调用`listen()`函数来完成。
`listen()`函数需要两个参数:一个是用来指定最大连接数的整数;另一个是用来指定阻塞时间(以秒为单位)的整数。
4. 接受连接:当一个客户端尝试连接到服务器时,服务器可以使用`accept()`函数来接受这个连接。
`accept()`函数会阻塞直到有一个客户端尝试连接。
如果客户端成功地建立了连接,`accept()`函数会返回一个新的文件描述符,该文件描述符可以用于与客户端通信。
5. 发送和接收数据:一旦连接被接受,就可以使用`send()`和`recv()`函数来发送和接收数据了。
这些函数类似于普通的文件I/O函数,只不过它们操作的是网络连接而不是文件。
6. 关闭Socket:最后,当通信完成后,需要使用`close()`函数来关闭Socket。
以上就是C语言中Socket通信的基本过程。
在实际应用中,可能还需要处理错误、进行超时处理、使用非阻塞I/O等更复杂的情况。
Socket5&HTTP代理源码(封装类)
public:
CProxy();
virtual ~CProxy();
BOOL Negotiate(SOCKET s, tNetgotiate* pNet);
tagUDPHeadS5* GetS5UDPHead();
private:
BOOL NetgotiateSocket5(SOCKET s, tNetgotiate* pNet);
** 版 本: V1.001
**-------------------------------------------------------------
****************************************************************/
#define _MAX_PROXSEND 4096
{
return m_pUdpHeadS5;
}
/*****************************函数说明****************************
** 函 数: CProxy::Negotiate
** 功 能: 代理协商
** 设 计: shawn
// 文件名: Proxy.cpp
// 类 名: CProxy
// 描 述:
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
tagUDPHeadS5* m_pUdpHeadS5;
Socket与Http方式解析发送xml消息封装中间件jar包
Socket与Http⽅式解析发送xml消息封装中间件jar包 最近项⽬代码中太多重复的编写Document,不同的接⼝需要不同的模板,于是重写提取公共部分打成jar包,⽅便各个系统统⼀使⽤~ 提取结构:Http连接⽅式:import java.nio.charset.Charset;import java.util.Arrays;import java.util.List;import java.util.Map;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.http.HttpEntity;import org.springframework.http.HttpHeaders;import org.springframework.http.MediaType;import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;import org.springframework.http.converter.StringHttpMessageConverter;import org.springframework.web.client.RestTemplate;public class HttpConnect {final Logger logger = LoggerFactory.getLogger(this.getClass());public static final String SECCUESS_CODE = "000000";private RestTemplate restTemplate ;private int connectTimeout = 1000;private int readTimeout = 15000;private static final String CHARSET_GBK = "GBK";public String getMessages(Map<String,Object> sendData){restTemplate = createRestTemplate();HttpHeaders headers = new HttpHeaders();MediaType type = new MediaType("text", "xml",Charset.forName(CHARSET_GBK));headers.setContentType(type);String connectIp = (String) sendData.get("RequestIp");String connectPort = (String) sendData.get("RequestPort");String content = (String) sendData.get("message");String url = "http://" + connectIp + ":" + connectPort;HttpEntity<String> entity = new HttpEntity<String>(content, headers);String result = restTemplate.postForObject(url, entity, String.class);("send data:{},result:{}", content, result);return result;}public RestTemplate createRestTemplate() {HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();requestFactory.setConnectTimeout(connectTimeout);requestFactory.setReadTimeout(readTimeout);RestTemplate restTemplate = new RestTemplate(requestFactory);restTemplate.getMessageConverters().add(0,new MyStringHttpMessageConverter());return restTemplate;}static class MyStringHttpMessageConverter extendsStringHttpMessageConverter {List<Charset> acceptedCharsets = Arrays.asList(Charset.forName("GBK"),Charset.forName("GB2312"), Charset.forName("GB18030"),Charset.forName("UTF-8"));@Overrideprotected List<Charset> getAcceptedCharsets() {return acceptedCharsets;}}}Socket⽅式:package SocketClient;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import .ConnectException;import .InetAddress;import .InetSocketAddress;import .Socket;import .SocketTimeoutException;import .UnknownHostException;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class SocketClient {final Logger logger = LoggerFactory.getLogger(this.getClass());private Socket socket;public SocketClient() {}public SocketClient(String connectIp, String connectPort, String connectTime, String readTime) throws SocketTimeoutException, ConnectException, UnknownHostException, Exception { createSocket(connectIp, connectPort, connectTime, readTime);}private void createSocket(String hostName, String port, String connectTime, String readTime) throws SocketTimeoutException, ConnectException, UnknownHostException, Exception { InetAddress address = InetAddress.getByName(hostName); int timeOut = Integer.parseInt(connectTime); int readTimeOut = Integer.parseInt(readTime); socket = new Socket(); int connectPort = Integer.valueOf(port); InetSocketAddress socketAddr = new InetSocketAddress(address, connectPort); // 连接后返回结果超时时间 socket.setSoTimeout(readTimeOut); socket.setReuseAddress(true); socket.connect(socketAddr, timeOut);}public void sendData(byte[] data) throws IOException,RuntimeException{ DataOutputStream dos = null;try { dos = new DataOutputStream(socket.getOutputStream()); dos.writeInt(data.length); dos.write(data);} catch (IOException e) { e.printStackTrace();} catch (RuntimeException e) { e.printStackTrace();} finally { if (dos != null) { dos.close(); } }}public byte[] recvData() throws Exception { byte[] data = null; DataInputStream dis = null; try { dis = new DataInputStream(socket.getInputStream()); int dataLen = dis.readInt(); data = new byte[dataLen]; dis.readFully(data); } catch (IOException e) { e.printStackTrace(); }finally { if (dis != null) { dis.close(); } } return data;}public void destory() {if (this.socket != null && !this.socket.isClosed()) { try { this.socket.close(); this.socket = null; } catch (IOException e) { logger.error("Socket Destory Error",e); } } }}加载hdfs中的模板⽂件,并转化为map形式嵌⼊项⽬中,存⼊内存缓存import java.io.IOException;import java.io.InputStream;import java.util.HashMap;import java.util.List;import java.util.Map;import mons.io.IOUtils;import ng3.StringUtils;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class LoadHdfsTemplate {static final Logger logger = LoggerFactory.getLogger(LoadHdfsTemplate.class);protected FileSystem fileSystem;public final boolean checkFile(String filePath) {boolean exists = false;try {Path path = new Path(filePath);exists = fileSystem.exists(path);} catch (IOException e) {logger.error("模板⽂件不存在!", e);} catch (Exception e) {logger.error("", e);}return exists;}public Map<String,Object> readHdfsFile(String hdfsPath) throws IOException{Path path = new Path(hdfsPath);InputStream in = fileSystem.open(path);List<String> lines = IOUtils.readLines(in);if(null == lines || lines.isEmpty()){return null;}Map<String,Object> map = new HashMap<String,Object>();int rowNum = 0;for(String line : lines){rowNum++;String[] content = line.split(" ");String code = content[0];String template = content[1];if(StringUtils.isEmpty(line) || StringUtils.isEmpty(template)){logger.error("第{}条模板格式错误!内容为:{}",rowNum,line);continue;}map.put(code, template);}return map;}}加载本地⽂件,⽤于测试import java.io.File;import java.io.IOException;import java.util.HashMap;import java.util.Map;import ng3.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import mon.base.Charsets;import mon.io.Files;import mon.io.LineProcessor;public class LoadTemplate{final Logger logger = LoggerFactory.getLogger(LoadTemplate.class);private String filePath = "D:/template.txt";public Map<String,Object> templateMap = new HashMap<String,Object>();public Map<String, Object> loadTemplate() {try {File file = new File(filePath);Integer lineCount = Files.readLines(file, Charsets.UTF_8,new LineProcessor<Integer>() {private int lineCount;public boolean processLine(String line)throws IOException {doSync(line);lineCount++;logger.debug("{} : {}", lineCount, line);return true;}public Integer getResult() {return lineCount;}});("读取{}⾏数据。
socket编程实现HTTP下载思路,未实现的可以直接用微软的wininet库...
socket编程实现HTTP下载思路,未实现的可以直接用微软的wininet库...socket编程实现HTTP下载思路,未实现的可以直接用微软的 wininet 库 (转载)作者:吴豆豆来源:博客园发布时间:2011-08-15 20:17 阅读:4 次原文链接 [收藏]在Windows下实现HTTP下载,其实很容易,微软已经帮我们封装好了简便易用的wininet库,利用它提供的API,很容易就能开发出具备HTTP下载功能的程序,不过我在这里并不准备对wininet进行讨论,有兴趣的朋友可以自行查阅MSDN或者相关资料。
我在这里要说的,是直接使用socket编程,来实现HTTP的下载。
这种看似底层和原始的方法,虽然实现起来比较麻烦(仅仅是麻烦而已,其实很简单),但对我们了解HTTP的工作原理和应对非Windows平台的编程,都有一定的帮助,所以我将这几天自己学习的心得体会,记录于此。
本文主要涉及socket编程实现直接HTTP下载和通过代理服务器进行HTTP下载。
HTTP消息头说是socket编程,但核心其实是对HTTP消息头的处理,包括格式化发送,以及接受解析。
一个典型的用于下载的HTTP请求头大概是这样的:GET /test/test.zip HTTP/1.1-- "GET"是命令,后接要下载的文件,HTTP表示版本Host: -- 主机域名Accept: */*-- 接受任何类型的文件User-Agent: MyApp-- 浏览器的类型Connection: Keep-Alive-- 保持连接-- 空行,表示请求头结束"--"后面的是我加的注释,请求头不包括这些东西。
这里注意还有一个内容没有列出来,但是对于HTTP下载来说是比较重要的,就是"Range"项,像这样"Range: bytes=起始位置- 终止位置",要实现多线程下载和断点续传就都靠他了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void SendString(SOCKET sock,LPCSTR str);
BOOL ValidHostChar(char ch);
void ParseURL(string url,LPSTR protocol,int lprotocol, LPSTR host,int lhost,LPSTR request,int lrequest,int *port);
buffer of memory that will grow to hold variable sized
parts of the HTTP message.
*/
typedef struct
{
Request::Request()
{
}
Request::~Request()
{
}
//*******************************************************************************************************
if (i)
{
cout<<"Http头:"<<endl;
cout<< sHeaderSend <<endl;
cout<<"响应头"<<endl;
cout<< sHeaderReceive <<endl;
if (i)
{
cout<<"Http头:"<<endl;
cout<< sHeaderSend <<endl;
cout<<"响应头"<<endl;
cout<< sHeaderReceive <<endl;
};
#endif // !defined(AFX_REQUEST_H__9F2C9BB6_CBA7_40AF_80A4_09A1CE1CE220__INCLUDED_)
Request.cpp
//******************************************
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
LPSTR headerReceive; // Pointer to HTTP headers Receive
LPSTR message; // Pointer to the HTTP message
Request();
virtual ~Request();
private:
void MemBufferCreate(MemBuffer *b);
void MemBufferGrow(MemBuffer *b);
#include <iostream>
#include <string>
#include "http/request.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
void MemBufferAddByte(MemBuffer *b, unsigned char byt);
void MemBufferAddBuffer(MemBuffer *b, unsigned char *buffer, size_t size);
cout<<"网页内容"<<endl;
cout<< sMessage <<endl;
}else
{
cout<<"网络不可到达"<<endl;
}
system("pause");
int SendHTTP(string url,LPCSTR headerReceive,BYTE *post, DWORD postLength,HTTPReq:
int SendRequest(bool IsPost, string url, string& psHeaderSend, string& pszHeaderReceive,string& pszMessage);
bool IsPost=false; //是否Post提交
int i =myRequest.SendRequest(IsPost, "", sHeaderSend,
sHeaderReceive, sMessage);
return 0;
}
#include "stdafx.h"
#include <iostream>
#include <string>
#include "http/request.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
long messageLength; // Length of the message
} HTTPRequest;
/*
MemBuffer: Structure used to implement a memory buffer, which is a
bool IsPost=false; //是否Post提交
int i =myRequest.SendRequest(IsPost, "", sHeaderSend,
sHeaderReceive, sMessage);
#if !defined(AFX_REQUEST_H__9F2C9BB6_CBA7_40AF_80A4_09A1CE1CE220__INCLUDED_)
#define AFX_REQUEST_H__9F2C9BB6_CBA7_40AF_80A4_09A1CE1CE220__INCLUDED_
cout<<"网页内容"<<endl;
cout<< sMessage <<endl;
}else
{
cout<<"网络不可到达"<<endl;
}
system("pause");
return 0;
//纯C++的Socket访问Http封装类,Neeao修改
//
//2009-08-25
//******************************************
#include "stdafx.h"
from the request
*/
typedef struct
{
LPSTR headerSend; // Pointer to HTTP header Send
unsigned char *buffer;
unsigned char *position;
size_t size;
} MemBuffer;
class Request
{
public:
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
}
类代码如下
//******************************************
//纯C++的socket访问Http封装类,Neeao修改
//
//2009-08-25
//******************************************
{
Request myRequest; //初始化类
string sHeaderSend; //定义http头
string sHeaderReceive; //返回头
string sMessage=""; //返回页面内容
Request myRequest; //初始化类
string sHeaderSend; //定义http头
string sHeaderReceive; //返回头
string sMessage=""; //返回页面内容
纯C++的Socket访问Http封装类
1.项目中要使用c++++来访问Web服务器,从网上找了个C++的封装类,其中调用了MFC,
在VC2005上用能用,但是移植到VC2003就出问题了,干脆修改成了纯C++的,不敢独享,share之。