<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-88  評(píng)論-77  文章-48  trackbacks-0
    本文轉(zhuǎn)自csdn,作者:kingcaiyao
    原標(biāo)題:在C++ Builder中用socket api來(lái)寫網(wǎng)絡(luò)通訊程序(同時(shí)支持TCP和UDP協(xié)議)
    原文:??http://www.csdn.net/develop/read_article.asp?id=19883


    在7月4日看完sockcomp.pas后,我決定用socket api來(lái)寫一個(gè)客戶端和服務(wù)器并且同時(shí)支持TCP,UDP協(xié)議,于是我就去做,現(xiàn)將代碼貼出來(lái)(已調(diào)試通過(guò))
    Socket api Client:

    #ifndef UDPClientH
    #define UDPClientH
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <stdio.h>
    #include "CCEdit.h"
    #define WM_SOCK WM_USER+100
    class TLANForm : public TForm
    {
    __published: // IDE-managed Components
    ???TEdit *Port;
    ???TLabel *Label1;
    ???TLabel *Label2;
    ???TComboBox *Prot;
    ???TButton *Button1;
    ???TLabel *Label3;
    ???TEdit *Addr;
    ???TCCEdit *TxtEdit;
    ???void __fastcall FormCreate(TObject *Sender);
    ???void __fastcall Button1Click(TObject *Sender);
    ???void __fastcall FormDestroy(TObject *Sender);
    private: // User declarations
    ???void __fastcall OnRecv(TMessage &Message);
    public:??// User declarations
    ???__fastcall TLANForm(TComponent* Owner);
    ???BEGIN_MESSAGE_MAP
    ??????VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);
    ???END_MESSAGE_MAP(TForm);
    };
    extern PACKAGE TLANForm *LANForm;
    #endif


    .cpp File

    #include <vcl.h>
    #pragma hdrstop
    #include "UDPClient.h"
    #include "WinSock.h"
    #pragma package(smart_init)
    #pragma link "CCEdit"
    #pragma resource "*.dfm"
    TLANForm *LANForm;
    enum PROTO {TCP=0,UDP=1};
    SOCKET m_Socket=INVALID_SOCKET;
    PROTO m_Protocol=TCP;
    __fastcall TLANForm::TLANForm(TComponent* Owner)
    ???: TForm(Owner)
    {

    }
    void __fastcall TLANForm::FormCreate(TObject *Sender)
    {
    ???::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);
    }
    void __fastcall TLANForm::OnRecv(TMessage &Message)
    {
    ???char buf[4096];
    ???int nLen;
    ???struct sockaddr_in from;
    ???int nLength=sizeof(struct sockaddr_in);
    ???switch(WSAGETSELECTEVENT(Message.LParam))
    ???{
    ??????case FD_READ:
    ?????????switch(m_Protocol)
    ?????????{
    ????????????case TCP:
    ???????????????nLen=recv(m_Socket,buf,4096,0);
    ???????????????if(nLen>0){
    ??????????????????buf[nLen]='\0';
    ??????????????????TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
    ???????????????}
    ???????????????break;
    ????????????case UDP:
    ???????????????nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);
    ???????????????if(nLen>0){
    ??????????????????buf[nLen]='\0';
    ??????????????????TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
    ???????????????}
    ???????????????break;
    ?????????}
    ?????????break;
    ??????case FD_CLOSE:
    ?????????closesocket(m_Socket);
    ?????????break;
    ???}
    }

    void __fastcall TLANForm::Button1Click(TObject *Sender)
    {
    ???char szTmp[256],buf[4096];
    ???int nSize=0;
    ???UINT m_Port;
    ???AnsiString addr;
    ???addr=Addr->Text.Trim();
    ???if(addr.IsEmpty()){
    ??????::MessageBox(0,"Please enter the server IP!","Error",MB_OK+MB_ICONERROR);
    ??????return;
    ???}
    ???unsigned long nAddr=inet_addr(addr.c_str());
    ???if(nAddr==INADDR_NONE){
    ??????::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);
    ??????return;}

    ???try
    ???{
    ??????m_Port=Port->Text.ToInt();
    ???}
    ???catch(Exception &e)
    ???{
    ??????::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
    ??????return;
    ???}
    ???switch(Prot->ItemIndex)
    ???{
    ??????case 0:
    ?????????m_Protocol=TCP;
    ?????????break;
    ??????case 1:
    ?????????m_Protocol=UDP;
    ?????????break;
    ???}
    ???if(TxtEdit->Text.IsEmpty()){
    ??????::MessageBox(0,"Please enter the text you want to send!","Error",MB_OK+MB_ICONERROR);
    ??????return;}

    ???//Initialize Winsocket
    ???WSAData wsaData;
    ???::ZeroMemory(&wsaData,sizeof(WSAData));
    ???WORD version=MAKEWORD(2,0);
    ???if(::WSAStartup(version,&wsaData)){
    ??????sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());
    ??????return;}

    ???//Obtain the active connection
    ???char ComputerName[255];
    ???gethostname(ComputerName,255);
    ???struct hostent* he=gethostbyname(ComputerName);
    ???if(!he){
    ??????sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);
    ??????::WSACleanup();
    ??????return;
    ???}
    ???//create new socket
    ???m_Socket=INVALID_SOCKET;
    ???switch(m_Protocol)
    ???{
    ??????case TCP:
    ?????????m_Socket=socket(AF_INET,SOCK_STREAM,0);
    ?????????break;
    ??????case UDP:
    ?????????m_Socket=socket(AF_INET,SOCK_DGRAM,0);
    ?????????break;
    ???}
    ???if(m_Socket==INVALID_SOCKET){
    ??????sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());
    ??????::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
    ??????::WSACleanup();
    ??????return;
    ???}
    ???//bind socket
    ???struct sockaddr_in client;
    ???unsigned long nClient;
    ???memcpy(&nClient,he->h_addr_list[0],sizeof(int));
    ???if(nClient==INADDR_NONE){
    ??????sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);
    ??????::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
    ??????closesocket(m_Socket);
    ??????::WSACleanup();
    ??????return;
    ???}
    ???client.sin_family=AF_INET;
    ???client.sin_port=0;
    ???client.sin_addr.S_un.S_addr=(int)nClient;
    ???if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){
    ??????sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);
    ??????closesocket(m_Socket);
    ??????::WSACleanup();
    ??????return;}
    ???//connect socket
    ???struct sockaddr_in To;
    ???To.sin_family=AF_INET;
    ???To.sin_port=htons(m_Port);
    ???To.sin_addr.S_un.S_addr=(int)nAddr;
    ???fd_set FDSET;
    ???FD_ZERO(&FDSET);
    ???FD_SET(m_Socket,&FDSET);


    ???if(m_Protocol==TCP){
    ??????if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){
    ?????????sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());
    ?????????::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
    ?????????closesocket(m_Socket);
    ?????????::WSACleanup();
    ?????????return;
    ??????}
    ??????int nError=select(1,0,&FDSET,0,0);
    ??????if(nError<=0){
    ??????sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());
    ??????closesocket(m_Socket);
    ??????::WSACleanup();
    ??????return;}
    ???}
    ???//Send data
    ???int nLen=TxtEdit->Text.Length();
    ???if(nLen>4096){
    ??????sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");
    ??????::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
    ??????closesocket(m_Socket);
    ??????::WSACleanup();
    ??????return;
    ???}
    ???strncpy(buf,TxtEdit->Text.c_str(),nLen);
    ???switch(m_Protocol)
    ???{
    ??????case TCP:
    ?????????nSize=send(m_Socket,buf,nLen,0);
    ?????????//ShowMessage(nSize);
    ?????????break;
    ??????case UDP:
    ?????????nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));
    ?????????//ShowMessage(nSize);
    ?????????break;

    ???}
    ???if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){
    ??????sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());
    ??????::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
    ??????closesocket(m_Socket);
    ??????::WSACleanup();
    ??????return;}
    }
    void __fastcall TLANForm::FormDestroy(TObject *Sender)
    {
    ???closesocket(m_Socket);
    ???::WSACleanup();
    }

    Socket api Server:
    .h File
    #ifndef UDPServerH
    #define UDPServerH
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <stdio.h>
    #include "WinSock.h"
    /*#define WM_SOCKET WM_USER+1000
    #define INITSOCKETSUCCESS 0
    #define INITSOCKETFAILURE 1
    #define CREATELISTENSOCKETSUCCESS 2
    #define CREATELISTENSOCKETFAILURE 3
    #define SETLISTENSOCKETSUCCESS 4
    #define SETLISTENSOCKETFAILURE 5
    #define BINDLISTENSOCKETSUCCESS 6
    #define BINDLISTENSOCKETFAILURE 7
    #define LISTENSOCKETSUCCESS 8
    #define LISTENSOCKETFAILURE 9
    #define ACCEPTSOCKETSUCCESS 10
    #define ACCEPTSOCKETFAILURE 11
    */
    class TPSTNForm : public TForm
    {
    __published: // IDE-managed Components
    ???TEdit *Port;
    ???TLabel *Label1;
    ???TMemo *Memo1;
    ???TButton *Button1;
    ???TButton *Button2;
    ???TLabel *Label2;
    ???TComboBox *Prot;
    ???void __fastcall Button1Click(TObject *Sender);
    ???void __fastcall Button2Click(TObject *Sender);
    ???void __fastcall FormCreate(TObject *Sender);
    ???void __fastcall FormDestroy(TObject *Sender);
    private: // User declarations
    public:??// User declarations
    ???__fastcall TPSTNForm(TComponent* Owner);
    };
    enum PROTO {TCP,UDP};
    class TCommunication:public TThread????//Communication Thread
    {
    private:
    ???SOCKET m_AcceptSocket;
    ???char szTmp[256];//ERROR MESSAGE
    public:
    ???__fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);
    ???__fastcall ~TCommunication();
    protected:
    ???virtual void __fastcall Execute();
    };
    class TListenThread:public TThread //Listen Thread
    {
    private:
    ???WSAData wsaData;
    ???struct sockaddr_in server;
    ???fd_set FDS;
    ???UINT m_Port;
    ???PROTO m_Protocol;
    ???char szTmp[256];//Error Message
    public:
    ???SOCKET m_Socket;
    ???void __fastcall DoError();
    ???void __fastcall InitSocket();
    ???void __fastcall CreateListenSocket();
    ???void __fastcall SetListenSocket();
    ???void __fastcall BindListenSocket();
    ???void __fastcall ListenSocket();

    public:
    ???__fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);
    ???virtual __fastcall ~TListenThread();
    protected:
    ???virtual void __fastcall Execute();
    };
    extern PACKAGE TPSTNForm *PSTNForm;
    #endif
    .cpp File
    #include <vcl.h>
    #pragma hdrstop
    #include "UDPServer.h"
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TPSTNForm *PSTNForm;
    TListenThread *pThread=0;
    //******************************CLASS TCommunication For TCP****************************************************
    __fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)
    {
    ???m_AcceptSocket=m_Socket;
    ???szTmp[0]='\0';
    ???FreeOnTerminate=true;
    }
    __fastcall TCommunication::~TCommunication()
    {
    ??// closesocket(m_AcceptSocket);
    }
    void __fastcall TCommunication::Execute()
    {
    ???char buf[4096];
    ???int nSize=0;
    ???nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);
    ???if(nSize>0)
    ???{
    ??????buf[nSize]='\0';
    ??????//Display
    ??????PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
    ??????PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
    ??????//Deliver
    ??????::Sleep(100);
    ??????send(m_AcceptSocket,buf,nSize,0);
    ???}

    }
    //******************************CLASS TListenThread*****************************************************
    __fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)
    {
    ???m_Socket=INVALID_SOCKET;
    ???m_Port=m_PortA;
    ???m_Protocol=m_ProtocolA;
    ???szTmp[0]='\0';
    ???::ZeroMemory(&wsaData,sizeof(WSAData));
    ???::ZeroMemory(&server,sizeof(struct sockaddr_in));
    ???FreeOnTerminate=TRUE;//Automatically delete while terminating.
    }
    __fastcall TListenThread::~TListenThread()
    {
    ???closesocket(m_Socket);
    ???::WSACleanup();
    ???m_Socket=INVALID_SOCKET;
    ???m_Port=0;
    ???m_Protocol=TCP;
    ???szTmp[0]='\0';
    ???::ZeroMemory(&wsaData,sizeof(WSAData));
    ???::ZeroMemory(&server,sizeof(struct sockaddr_in));
    }
    void __fastcall TListenThread::DoError()
    {
    ???if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);
    ???WSACleanup();
    ???return;
    }
    void __fastcall TListenThread::InitSocket()
    {
    ???WORD version=MAKEWORD(2,0);
    ???if(::WSAStartup(version,&wsaData)){
    ??????sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());
    ??????::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
    ??????DoError();
    ??????return;
    ???}
    }
    void __fastcall TListenThread::CreateListenSocket()
    {
    ???switch(m_Protocol)
    ???{
    ??????case UDP:
    ?????????m_Socket=socket(AF_INET,SOCK_DGRAM,0);
    ?????????break;
    ??????case TCP:
    ?????????m_Socket=socket(AF_INET,SOCK_STREAM,0);
    ?????????break;
    ??????default:
    ?????????sprintf(szTmp,"Error protocol!");
    ?????????::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
    ?????????DoError();
    ?????????break;
    ???}
    ???if(m_Socket==INVALID_SOCKET){
    ??????sprintf(szTmp,"Failed to create socket!");
    ??????::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
    ??????DoError();
    ??????return;
    ???}
    }
    void __fastcall TListenThread::SetListenSocket()
    {
    ???server.sin_family=AF_INET;
    ???server.sin_port=htons(m_Port);
    ???server.sin_addr.S_un.S_addr=INADDR_ANY;
    ???int NewOpenType=SO_SYNCHRONOUS_NONALERT;
    ???if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){
    ??????sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());
    ??????::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
    ??????DoError();
    ??????return;
    ???}
    }
    void __fastcall TListenThread::BindListenSocket()
    {
    ????if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){
    ??????sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
    ??????::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
    ??????DoError();
    ??????return;
    ???}

    }
    void __fastcall TListenThread::ListenSocket()
    {
    ??if(listen(m_Socket,SOMAXCONN)){
    ?????sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());
    ?????::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
    ?????DoError();
    ?????return;
    ??}
    ??//Determine whether there is any connection
    ??FD_ZERO(&FDS);
    ??FD_SET(m_Socket,&FDS);
    }
    void __fastcall TListenThread::Execute()
    {
    ???char buf[4096];
    ???struct sockaddr_in from; //for UDP
    ???int nLen=sizeof(from),nSize=0;??//for UDP
    ???InitSocket();
    ???CreateListenSocket();
    ???SetListenSocket();
    ???BindListenSocket();
    ???if(m_Protocol==UDP){
    ??????while(!Terminated){
    ?????????int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);
    ?????????if(nSize>0){
    ????????????buf[nSize]='\0';
    ????????????PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
    ????????????PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
    ????????????::Sleep(100);
    ????????????sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));
    ?????????}
    ?????????else return;

    ??????}
    ???}
    ???ListenSocket();
    ???struct sockaddr_in client;
    ???int nLength=sizeof(struct sockaddr_in);
    ???while(!Terminated){
    ??????int nError=select(1,&FDS,0,0,0);
    ??????if(nError<=0) Terminate();
    ??????SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);
    ??????if(m_AcceptSocket==INVALID_SOCKET){
    ?????????sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());
    ?????????::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
    ?????????DoError();
    ?????????Terminate();
    ?????????return;
    ??????}
    ??????TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);
    ??????pCThread->Terminate();
    ??????pCThread->WaitFor();
    ???}
    }
    //************************PSTNForm*********************************************//
    __fastcall TPSTNForm::TPSTNForm(TComponent* Owner)
    ???: TForm(Owner)
    {
    }
    void __fastcall TPSTNForm::Button1Click(TObject *Sender)
    {
    ???Close();
    }
    void __fastcall TPSTNForm::Button2Click(TObject *Sender)
    {
    ???if(pThread){
    ??????pThread->Suspend();
    ??????pThread->Terminate();
    ??????delete pThread;
    ??????pThread=0;
    ???}
    ???UINT m_Port;
    ???try
    ???{
    ??????m_Port=Port->Text.ToInt();
    ???}
    ???catch(Exception &e)
    ???{
    ??????::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
    ??????return;
    ???}
    ???PROTO m_Protocol;
    ???switch(Prot->ItemIndex)
    ???{
    ??????case 0:
    ?????????m_Protocol=TCP;
    ?????????break;
    ??????case 1:
    ?????????m_Protocol=UDP;
    ?????????break;
    ??????default:
    ?????????break;
    ???}
    ???pThread=new TListenThread(m_Protocol,m_Port,FALSE);
    ???//pThread->Terminate();
    }
    void __fastcall TPSTNForm::FormCreate(TObject *Sender)
    {
    ???::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);
    }

    void __fastcall TPSTNForm::FormDestroy(TObject *Sender)
    {
    ???if(pThread){
    ??????pThread->Suspend();
    ??????pThread->Terminate();}
    }
    上面的代碼,各位可根據(jù)自已的需要和針對(duì)自已的應(yīng)用,在數(shù)據(jù)處理方面加以改進(jìn)就可以了
    posted on 2006-04-29 20:52 崛起的程序員 閱讀(520) 評(píng)論(0)  編輯  收藏 所屬分類: c/c++
    主站蜘蛛池模板: 香蕉视频免费在线| 亚洲国产日韩精品| 亚洲精品国产福利一二区| 国产又黄又爽又刺激的免费网址| 妞干网免费观看视频| 日本高清免费中文字幕不卡| 亚洲精品综合久久| 一级一看免费完整版毛片| 99久久久国产精品免费蜜臀| 亚洲精品视频免费看| 日韩免费视频一区| 亚洲av永久中文无码精品综合 | 特级做A爰片毛片免费看无码 | 中文字幕无码日韩专区免费| av无码免费一区二区三区| 永久免费看bbb| 91亚洲自偷手机在线观看| 亚洲国产中文在线二区三区免| 亚洲国产精品无码久久| 韩国18福利视频免费观看| 美美女高清毛片视频黄的一免费 | 全部一级一级毛片免费看| 在线看片韩国免费人成视频| 亚洲Av无码一区二区二三区| a毛片免费全部播放完整成| 亚洲av无码一区二区三区不卡| 国产精品久久久久久亚洲影视| 最近最好最新2019中文字幕免费| 免费大黄网站在线观| 亚洲国色天香视频| 久久免费观看国产99精品| 亚洲精品无码久久久久AV麻豆| 国产精品免费久久久久影院 | jizz在线免费观看| 亚洲精品在线观看视频| 日本永久免费a∨在线视频| 久久精品国产亚洲一区二区| 精品成人一区二区三区免费视频| 国内外成人免费视频| 国产精品免费αv视频| 日韩亚洲人成在线|