Skip to content

Instantly share code, notes, and snippets.

@johnhmj
Last active August 29, 2015 14:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save johnhmj/11365657 to your computer and use it in GitHub Desktop.
Save johnhmj/11365657 to your computer and use it in GitHub Desktop.
Socket, client socket, HTTP request
#pragma comment(lib, "Ws2_32.lib")
#include <iostream>
#include <WinSock2.h>
#define BUF_SIZE 4096
//
int main(int argc, char* argv[])
{
struct hostent *d;
struct sockaddr_in a;
SOCKET s;
int n;
char buffer[BUF_SIZE];
char* request = "GET / HTTP/1.1\r\n\r\n";
//
// 初始化 WinSock DLL Ws2_32.lib
//
WSAData wsadata;
WSAStartup(MAKEWORD(2,2), &wsadata);
memset((void*)&a, 0, sizeof(struct sockaddr_in));
memset((void*)buffer, 0, sizeof(char)*BUF_SIZE);
//
// 自主機取得位址資料
//
d = gethostbyname("www.google.com");
if (d == NULL)
{
std::cout << "Error: domain failure." << std::endl;
WSACleanup();
return 0;
}
//
// 使用 IP v4 家族
//
//a.sin_family = AF_INET;
a.sin_family = d->h_addrtype;
//
// 指定連接位址
//
//a.sin_addr.S_un.S_addr = inet_addr("192.168.0.1");
//
// 複製位址清單的第一個位址
//
memcpy(&a.sin_addr, d->h_addr_list[0], d->h_length);
//
// 指定連接埠
//
a.sin_port = htons(80);
//
// 建立一個 Socket
//
s = socket(a.sin_family, SOCK_STREAM, IPPROTO_TCP);
if (s == INVALID_SOCKET)
{
std::cout << "Error: socket failure." << std::endl;
closesocket(s);
WSACleanup();
return 0;
}
//
// 建立連線
//
n = connect(s,(SOCKADDR*)&a, sizeof(struct sockaddr_in));
std::cout << "Connecting " << inet_ntoa(a.sin_addr) << " ..." << std::endl << std::endl;
if (n != 0)
{
std::cout << "Error: connect failure." << std::endl;
closesocket(s);
WSACleanup();
return 0;
}
//
// 傳送 http 網頁請求
//
n = send(s, request, strlen(request), 0);
if (n == SOCKET_ERROR)
{
std::cout << "Error: send failure." << std::endl;
closesocket(s);
WSACleanup();
return 0;
}
memset(buffer, 0, sizeof(char)*BUF_SIZE);
//
// 接收資料
//
n = recv(s, buffer, sizeof(char)*BUF_SIZE, 0);
if (n != SOCKET_ERROR)
{
std::cout << buffer << std::endl;
}
//
// 關閉 Socket
//
closesocket(s);
//
// 終止 WinSock DLL Ws2_32.lib
//
WSACleanup();
//
// 暫停
//
std::cout << "Press any key to continue ...";
std::cin.get();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment