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

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

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

    隨筆-88  評論-77  文章-48  trackbacks-0
    本文轉自csdn,作者:kingcaiyao
    原標題:在C++ Builder中用socket api來寫網絡通訊程序(同時支持TCP和UDP協議)
    原文:??http://www.csdn.net/develop/read_article.asp?id=19883


    在7月4日看完sockcomp.pas后,我決定用socket api來寫一個客戶端和服務器并且同時支持TCP,UDP協議,于是我就去做,現將代碼貼出來(已調試通過)
    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();}
    }
    上面的代碼,各位可根據自已的需要和針對自已的應用,在數據處理方面加以改進就可以了
    posted on 2006-04-29 20:52 崛起的程序員 閱讀(522) 評論(0)  編輯  收藏 所屬分類: c/c++
    主站蜘蛛池模板: 免费无码国产V片在线观看| 亚洲人成网站影音先锋播放| 在线永久看片免费的视频| 免费观看AV片在线播放| 日本高清免费不卡视频| 亚洲AV无码不卡在线观看下载| 亚洲Av无码国产情品久久| 美女视频黄频a免费观看| 你懂的免费在线观看网站| 亚洲一级毛片免费看| 免费国产不卡午夜福在线| 亚洲午夜久久久久久久久久| 亚洲精品视频在线| 亚洲一区二区三区免费视频| 亚洲午夜精品国产电影在线观看| 亚洲精品无码久久久久久| 国产精品偷伦视频免费观看了| 99久久久国产精品免费牛牛| 手机看片久久国产免费| 黄色免费在线观看网址| 亚洲午夜久久久久妓女影院| 久久青草91免费观看| 久久乐国产综合亚洲精品| a毛片成人免费全部播放| 亚洲av无码精品网站| 免费手机在线看片| 亚洲91av视频| a级毛片高清免费视频| 在线免费观看色片| 久久综合亚洲鲁鲁五月天| 一级毛片成人免费看a| 思思99re66在线精品免费观看| 黄色毛片免费在线观看| 亚洲专区先锋影音| 全黄大全大色全免费大片| 亚洲福利视频网站| 免费无码成人AV在线播放不卡| 中文文字幕文字幕亚洲色| 亚洲视频免费在线看| 少妇中文字幕乱码亚洲影视| 黄页网站免费在线观看|