웹 페이지의 소스를 읽는 데이 C++ 코드가 있습니다.경관 또는 웹 사이트에서 웹 페이지의 소스를 읽으십시오.
#include "stdafx.h"
#include <winsock2.h>
#include <windows.h>
#include <iostream>
#include <fstream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main(){
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
cout << "WSAStartup failed.\n";
system("pause");
return 1;
}
SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct hostent *host;
host = gethostbyname("www.last.fm");
SOCKADDR_IN SockAddr;
SockAddr.sin_port = htons(80);
SockAddr.sin_family = AF_INET;
SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
cout << "Connecting...\n";
if (connect(Socket, (SOCKADDR*)(&SockAddr), sizeof(SockAddr)) != 0){
cout << "Could not connect";
system("pause");
return 1;
}
cout << "Connected.\n";
send(Socket, "GET /music/Taylor+swift/+albums?order=reach&page=1 HTTP/1.1\r\nHost: www.last.fm\r\nConnection: close\r\n\r\n", strlen("GET /music/taylor+swift/+albums?order=reach&page=1 HTTP/1.1\r\nHost: www.cplusplus.com\r\nConnection: close\r\n\r\n"), 0);
char buffer[10000];
int nDataLength;
while ((nDataLength = recv(Socket, buffer, 10000, 0)) > 0){
int i = 0;
while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
cout << buffer[i];
i += 1;
}
}
closesocket(Socket);
WSACleanup();
system("pause");
return 0;
}
나는 이것을 fasm 어셈블리로 변환하려고 시도했지만 작동하지 않았습니다. 누군가 그것을 조립으로 전환시키는 것을 도울 수 있습니까? 덕분에 (내가 그래서이 코드가 가까우면 확실하지 않다 전에 ASM 소켓과 협력하거나하지 못했던주의, 나는 그것이 연결 생각하지만, 그것은 빈 메시지 박스 대신 웹 페이지 소스 코드 제공)
format PE GUI 4.0
entry start
include '\Fasm\INCLUDE\win32ax.inc'
section '.data' data readable writeable
IPPROTO_TCP = 6
wsadata WSADATA
_caption db 'Client application',0
_igang db 'The client has started very well.',13,10,'It is now going to connect to your own computer',0
_hostname db 'Wrong hostname',0
hostname db 'www.lastfm.com',0
hSock dd ?
saddr sockaddr_in
sizesaddr = $-saddr
buffer rb 0x3000
sender db 'GET /music/Taylor+swift/+albums?order=reach&page=1 HTTP/1.1\r\nHost: www.last.fm\r\nConnection: close\r\n\r\n',13,10
rb 0x100
section '.code' code readable executable
start:
invoke WSAStartup,0101h,wsadata ; initialiserer winsock-bibliotek
invoke ws_gethostbyname,hostname
or eax,eax
jz bad_hostname
virtual at eax
.host hostent
end virtual
mov eax,[.host.h_addr_list]
mov eax,[eax]
mov eax,[eax]
mov [saddr.sin_addr],eax
invoke MessageBox,0,_igang,_caption,0
mov al,00
mov ah,80 ; port 80
mov [saddr.sin_port],ax
mov [saddr.sin_family],AF_INET
invoke ws_socket, AF_INET, SOCK_STREAM, IPPROTO_TCP
mov [hSock], eax
xchg eax, esi
invoke ws_connect, esi, saddr, sizesaddr
.if eax = 0
invoke MessageBox,0, "connected", _caption,0
.endif
.if eax <> 0
invoke MessageBox,0, "not connected", _caption,0
.endif
mov ebx, buffer
invoke ws_send,esi,sender,109,0
invoke ws_recv, esi, ebx, 1000, 0
invoke MessageBox,0, buffer, _caption,0
.connectSucceeded:
invoke ws_closesocket,esi
invoke WSACleanup
jmp stopp
bad_hostname:
invoke MessageBox,0,_hostname,_caption,0
jmp stopp
stopp:
invoke ExitProcess,0
section '.idata' import data readable writeable
library kernel,'KERNEL32.DLL',\
winsock,'WSOCK32.DLL',\
user,'USER32.DLL'
import kernel,\
ExitProcess,'ExitProcess'
import winsock,\
WSAStartup,'WSAStartup',\
ws_socket,'socket',\
ws_connect,'connect',\
ws_gethostbyname,'gethostbyname',\
ws_send,'send',\
ws_recv,'recv',\
ws_closesocket,'closesocket',\
WSACleanup,'WSACleanup'
import user,\
MessageBox,'MessageBoxA'
_ "누군가가 나를 어셈블리로 변환하는 데 도움을 줄 수 있습니까?"_는 StackOverflow에서 특히 좋은 질문이 아닙니다. 문제가있는 코드의 특정 부분을 가리킬 수 있습니까? (코드 조각이 무엇을 기대하고 실제로 무엇을하는지에 대한 설명을 포함하십시오.) – Michael
포트 80에서 lastfm에 연결되어있는 것처럼 보이지만 올바른 GET 메시지를 보내지 않는다고 생각합니다. –
나는 이것에 대해 많은 경험이 없지만 GET 메시지의 형식이 매우 까다 롭다고 말할 수 있습니다. "/ n/r"이 올바르게 이스케이프 처리되는지 궁금합니다. 내가 당신이 얻고있는 것이 확실하지 않다면 그것들을 명시적인 "13, 10"으로 대체하려고 노력할 것입니다. –