C# socket 에이전트를 연결하고 메시지 전달
3837 단어 c#
sock4의 TCP 에이전트 워크플로우: 1.우리는 우선 서버를 연결한 후에 데이터를 서버에 발송한다.사용자 암호 인증이 없기 때문에 우리는 9바이트의 데이터를 보내서 0401+목표 포트(2바이트)+목표 IP(4바이트)+00로 써야 한다. 그 중에서 목표 포트와 목표 IP는 우리가 진정으로 연결하고자 하는 서버 포트와 서버 주소이다.이.프록시 서버는 8바이트의 데이터를 되돌려줍니다. 우리는 2바이트가 90인지 아닌지만 판단하면 됩니다. 90 연결이 성공하지 않으면 실패합니다.나머지 작업은 프록시 서버가 존재하지 않는 것과 마찬가지로 전송\로 데이터를 받아들일 수 있습니다.
1 포트 번호를 통해 프록시 서버 연결
System.Net.Sockets.Socket VSocket = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
VSocket..Connect(_proxyHost, _proxyPort);
2 바이트 데이터를 서버에 전송하여 인증합니다. 여기는 socket4 연결입니다. 두 번째 바이트는 90으로 연결이 성공했습니다.
internal virtual void SendCommand(NetworkStream proxy, byte command, string destinationHost, int destinationPort, string userId)
{
if (userId == null)
userId = "";
byte[] destIp = GetIPAddressBytes(destinationHost);
byte[] destPort = GetDestinationPortBytes(destinationPort);
byte[] userIdBytes = ASCIIEncoding.ASCII.GetBytes(userId);
byte[] request = new byte[9 + userIdBytes.Length];
// set the bits on the request byte array
request[0] = SOCKS4_VERSION_NUMBER;
request[1] = command;
destPort.CopyTo(request, 2);
destIp.CopyTo(request, 4);
userIdBytes.CopyTo(request, 8);
request[8 + userIdBytes.Length] = 0x00; // null (byte with all zeros) terminator for userId
// send the connect request
proxy.Write(request, 0, request.Length);
// wait for the proxy server to respond
WaitForData(proxy);
byte[] response = new byte[8];
// read the resonse from the network stream
proxy.Read(response, 0, 8);
// evaluate the reply code for an error condition
if (response[1] != SOCKS4_CMD_REPLY_REQUEST_GRANTED)
HandleProxyCommandError(response, destinationHost, destinationPort);
}
3 http를 조립하여 프록시 서버에 머리카락을 요청합니다.
var str="GET http://10.100.110.144/ HTTP/1.1\r
Accept: text/html, application/xhtml+xml, */*\r
Accept-Language: zh-CN\r
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko\r
Accept-Encoding: gzip, deflate\r
Host: 10.100.110.144\r
DNT: 1\r
Proxy-Connection: Keep-Alive\r
\r
"
VSocket.Send(str);
4 반환 정보 얻기
Restr = Receive(VSocket);
private string Receive(Socket socketSend)
{
string str = "";
while (true)
{
byte[] buffer = new byte[10000];
//
int r = socketSend.Receive(buffer);
str+= Encoding.Default.GetString(buffer, 0, r - 1);
if (r< 10000)
{
break;
}
}
return str;
}
이렇게 하면 성능이 매우 낭비되니, 아래의 이런 작법으로 바꾸어라
private string Receive(Socket socketSend)
{
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
do
{
bytes = socketSend.Receive(recvBytes, recvBytes.Length, 0); //
recvStr += Encoding.UTF8.GetString(recvBytes, 0, bytes); //
} while (bytes == 1024);
return recvStr;
}
1 순환 밖에서 수조 수신 데이터 성명
2 수신 그룹 길이로 문자열로 변환
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.