| 关键词: nbsp request addr server sockfd proxy connect return char error |
//simple web browser, use specified SOCKS5 proxy to make request #include <winsock2.h> #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #define PORT 80 #define HTTP_REQUEST_FORMAT "GET %s HTTP/1.0\n\n" int main(int argc, char **argv) { WSADATA wsaData; int sockfd, bufsiz, t, i; struct sockaddr_in addr; struct hostent *he; char http_request[1040]; char server[256]; char page[1024]; char proxy_addr[256]; char rdata[256]; int proxy_port; char SOCKS5_REQUEST_INIT[] = {5, 1, 0}; //version 5, no auth char server_response_1[2]; char socks_connect_request[512]; int destname_ip; char *ch = socks_connect_request; char c; if (argc != 5) { puts("viewer dest page proxy proxy_port"); return 0; } sscanf(argv[1], "%255s", server); sscanf(argv[2], "%1023s", page); sscanf(argv[3], "%255s", proxy_addr); sscanf(argv[4], "%d", &proxy_port); if (WSAStartup(0x202, &wsaData) == -1) {//init winsock puts("Fatal error: WSAStartup failed."); return 1; } sockfd = WSASocket(AF_INET, SOCK_STREAM, 0, 0, 0, 0); if (sockfd == -1) { puts("Fatal error: socket failed."); return 1; } ((struct in_addr*) &addr)->s_addr = inet_addr(proxy_addr); if (((struct in_addr*) &addr)->s_addr != INADDR_NONE) { if ((he = gethostbyaddr((char*) &addr, 4, AF_INET)) == 0) { puts("Fatal error: gethostbyaddr failed."); return 1; } } else { if ((he = gethostbyname(proxy_addr)) == 0) { puts("Fatal error: gethostbyname failed."); return 1; } } addr.sin_family = AF_INET; addr.sin_port = htons(proxy_port); addr.sin_addr = *((struct in_addr *) he->h_addr); if (connect(sockfd, (struct sockaddr*) &addr, 16) == -1) { puts("Fatal error: connect to proxy failed."); return 1; } //now connected to proxy server if (send(sockfd, SOCKS5_REQUEST_INIT, sizeof(SOCKS5_REQUEST_INIT), 0) == -1) { puts("FATAL ERROR: COULD NOT SEND REQUEST TO PROXY"); return 1; } if (recv(sockfd, server_response_1, sizeof(server_response_1), 0) == -1) { puts("FATAL ERROR: PROXY NOT RESPOND"); return 1; } if (server_response_1[1]) { printf("Error: proxy required authentication %x\n", server_response_1[1]); return 1; } socks_connect_request[0] = 5; //SOCKS version 5 socks_connect_request[1] = 1; //TCP/IP connect socks_connect_request[2] = 0; if (inet_addr(server) == INADDR_NONE) //check if user specified ip or hostname for dest server destname_ip = 0; else destname_ip = 1; socks_connect_request[3] = (destname_ip ? 1 : 3); //ip or hostname ch += 4; if (destname_ip) { *((DWORD *) ch) = inet_addr(server); ch += 4; } else { int i = strlen(server); *ch = (char) i; strcpy(ch + 1, server); //copy hostname ch += i + 1; } *((short *) ch) = htons(PORT); //remote server port if (send(sockfd, socks_connect_request, (int) (ch + 2 - socks_connect_request), 0) == -1) { //send connect request printf("%d\n", WSAGetLastError()); puts("FATAL ERROR: CANNOT SEND REQUEST TO PROXY"); return 1; } recv(sockfd, rdata, 4, 0); //read server response if (rdata[1] != 0) { printf("ERROR: SOCKS5 ERROR CODE %x\n", rdata[1]); return 1; } if (rdata[3] == 1) { recv(sockfd, rdata, 4, 0); } else { recv(sockfd, &c, 1, 0); recv(sockfd, rdata, c, 0); } recv(sockfd, rdata, 2, 0); sprintf(http_request, HTTP_REQUEST_FORMAT, page); //build valid HTTP request send(sockfd, http_request, strlen(http_request), 0); while (1) { char ch; int t = recv(sockfd, &ch, 1, 0); if (t == -1) { //recv error puts("\nERROR: recv failed"); break; } if (t == 0) //graceful disconnection break; putchar(ch); } closesocket(sockfd); WSACleanup(); return 0; } |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|