kotoraさんのブログ-net_test

WEB サーバに接続して、トップページだけを取得するプログラムのサンプルです。

GUI を使った例が、あんまり検索にひっかからなかったのでメモっときます。

Form.h の先頭に定義する内容です。
定義部分
#pragma once

#include <stdio.h>
#include <winsock2.h>
#include <vcclr.h>

#pragma comment(lib, "wsock32.lib")

SOCKET sock;
WSADATA wsaData;

オペレーションコードは、[connect]が押されたら動作します。
動作部分
private: System::Void button1_Click(
System::Object^ sender, System::EventArgs^ e) {
int line = 0;
char buff[32767] = "";
char *host;
int port;
int rt = 0;

host = (char*)conv_char_ptr(textBox1->Text);
if(host != NULL) {
port = Convert::ToInt32(textBox2->Text);
//接続
if(!TCPConnect(host, port)) {
rt = -1;
} else {
//送信
if(!TCPSend("GET / HTTP/1.0\n\n")) {
rt = -2;
}
//読み出し
if(!TCPRead(buff,(int)sizeof(buff))) {
rt = -3;
}
TCPClose();
} else {
rt = -4;
}
if(rt == 0) {
textBox3->Text = gcnew String(buff);
} else {
sprintf_s(buff, 32767, "ERROR: rtcode = %d\r\n", rt);
textBox3->Text = gcnew String(buff);
}
free(host);
}

char *conv_char_ptr(System::String^ str) {
pin_ptr <const wchar_t> wch = PtrToStringChars(str);
char *buf = (char *)malloc(1024);

sprintf_s(buf, 1024, "%S", wch);
return buf;
}

bool TCPConnect(char *server,u_short port){
if(WSAStartup(MAKEWORD(1, 1), &wsaData)!=0) {
return false;
}
sock = socket(PF_INET,SOCK_STREAM,0);
if(sock==INVALID_SOCKET) {
return false;
}
LPHOSTENT ipHost = gethostbyname(server);
if(ipHost == NULL) {
return false;
}
SOCKADDR_IN sockadd;
memset(&sockadd, 0, sizeof(sockadd));
sockadd.sin_family = AF_INET;
sockadd.sin_port = htons(port);
sockadd.sin_addr = *((LPIN_ADDR)*ipHost->h_addr_list);
if(connect(sock, (PSOCKADDR)&sockadd, sizeof(sockadd))!=0) {
return false;
}
return true;
}

bool TCPSend(char*sendWord){
int nRtn;
int i;

i = strlen(sendWord) + 1;
nRtn = send(sock, sendWord, i, 0);
if(nRtn==SOCKET_ERROR || nRtn==0) {
return FALSE;
} else {
return TRUE;
}
}

bool TCPRead(char*buff,int bfSize){
int nRtn;

nRtn = recv(sock,buff,bfSize,0);
if(nRtn==SOCKET_ERROR || nRtn==0) {
return FALSE;
} else {
buff[nRtn]='\0';
return TRUE;
}
}

void TCPClose(){
closesocket(sock);
WSACleanup();
}