|
컴퍼넌트 없이 소켓해봤던 겁니다.
대충 되는것만 확인하곤 더 이상 테스트는 안했어서
잘 살펴서 이용해 보시기 바랍니다...
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
#define WSA_READ (WM_USER + 1)
#define NO_FLAGS_SET 0 // Used with recv()/send()
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TMemo *Memo1;
TEdit *Edit1;
TButton *Button2;
void __fastcall Button1Click(TObject *Sender);
void __fastcall FormDestroy(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private: // User declarations
void __fastcall WSA_receive(TMessage &Msg);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WSA_READ,TMessage,WSA_receive);
END_MESSAGE_MAP(TForm);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#pragma hdrstop
#include <winsock2.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
SOCKET sock;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//connect 부분
int status;
WSADATA WSAData;
char szTemp[80];
if((status = WSAStartup(MAKEWORD(1,1), &WSAData)) == 0) {
MessageBox( NULL, WSAData.szDescription, WSAData.szSystemStatus, MB_OK);
}else{
sprintf(szTemp, "%d is the err", status);
MessageBox( NULL, szTemp, "Error", MB_OK);
}
sock=socket(AF_INET, SOCK_STREAM, 0);
// s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sock==INVALID_SOCKET){
ShowMessage("invalid socket");
closesocket( sock );
return;
}
// struct sockaddr_in{
// short sin_family;
// unsigned short sin_port;
// struct in_addr sin_addr;
// char sin_zero[8];
// };
struct in_addr addr={210,222,119,142}; //연결할 주소
SOCKADDR_IN dest_sin;
dest_sin.sin_family = AF_INET;
dest_sin.sin_addr=addr;
dest_sin.sin_port=htons(7458); //포트번호
if(connect(sock,(PSOCKADDR)&dest_sin,sizeof(dest_sin))<0){
closesocket( sock );
MessageBox(NULL, "connect() failed", "Error", MB_OK);
return;
}
if((status=WSAAsyncSelect( sock, Handle, WSA_READ, FD_READ | FD_CLOSE ))>0){
sprintf(szTemp,"%d (0x%x)");
MessageBox(NULL,"Error on WSAAsyncSelect()", szTemp, MB_OK);
closesocket(sock);
return;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
closesocket(sock);
WSACleanup();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WSA_receive(TMessage &Msg)
{
//receive
char buffer[2400];
if(WSAGETSELECTEVENT(Msg.LParam) == FD_READ) {
int status=recv((SOCKET)Msg.WParam,buffer,2400,NO_FLAGS_SET);
if(status){
buffer[status]='\0';
Memo1->Lines->Add(buffer);
}else{
MessageBox(NULL,"Connection broken","Error", MB_OK);
}
}
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
//send
AnsiString s_str=Edit1->Text.Trim();
send(sock,s_str.c_str(),s_str.Length(),NO_FLAGS_SET);
}
//---------------------------------------------------------------------------
.끝.
^^; 님이 쓰신 글 :
: 안냐세요.. 요즘 자주 등장하는 궁금이 입니다.
: 여러 많은 분들의 도움 덕분에 저의 지식 또한 늘어가는 것을 피부로 느낄 수 있습니다.
: 한 마디로 감사드리고, 아주 좋은 사이트 인거 같아여...^^
: 이번의 부탁은 ....
: 사실 저의 빌더 버전이 4.x라서 소켓 컴포넌트가 없습니다.
: 그래서 소켓 클래스를 사용해야 하는데 도움말에도 뭐라는지 모르겠고, 헤더 파일도 뭘 추가 해야하는지 모르겠여...T.T
: 소켓에 관련한 예제를 구할 순 없나여?
: 도와주세요...
:
|