Winsock编程实例

    技术2022-05-20  46

    unit   testEchoMain; interface uses     Windows,   Messages,   SysUtils,   Classes,   Graphics,   Controls,   Forms,   Dialogs,     Winsock,   ExtCtrls,   StdCtrls,   ComCtrls; type     TfrmMain   =   class(TForm)         edtSend:   TEdit;         Label1:   TLabel;         btnSend:   TButton;         edtPort:   TEdit;         edtHostIP:   TEdit;         Label4:   TLabel;         Label3:   TLabel;         Bevel1:   TBevel;         edtEcho:   TEdit;         Label5:   TLabel;         btnConnect:   TButton;         btnDisConnect:   TButton;         StatusBar1:   TStatusBar;         procedure   FormCreate(Sender:   TObject);         procedure   FormDestroy(Sender:   TObject);         procedure   btnConnectClick(Sender:   TObject);         procedure   btnDisConnectClick(Sender:   TObject);         procedure   btnSendClick(Sender:   TObject);     private         {   Private   declarations   }     public         {   Public   declarations   }     end; var     frmMain:   TfrmMain;     socket1:TSocket; implementation {$R   *.DFM} procedure   TfrmMain.FormCreate(Sender:   TObject); var         WSAData:TWSAData; begin         //初始化Socket         if   (WSAStartup(MAKEWORD(2,0),WSAData) <> 0)   then         begin                 //初始化失败                 StatusBar1.SimpleText:= 'Init   Failed ';                 exit;         end         else                 StatusBar1.SimpleText:= 'Init   Success '; end; procedure   TfrmMain.FormDestroy(Sender:   TObject); begin           //释放winsock           WSACleanUP(); end; procedure   TfrmMain.btnConnectClick(Sender:   TObject); var         SocketAddr:TSockAddr;         Re:Integer; begin         //建立socket         socket1:=socket(AF_INET,SOCK_STREAM,0);         if(socket1=INVALID_SOCKET)then         begin                 StatusBar1.SimpleText:= '错误:建立socket失败 ';                 exit;         end;         //连接主机         ZeroMemory(@SocketAddr,sizeof(SocketAddr));         SocketAddr.sin_family   :=AF_INET;         SocketAddr.sin_addr.s_addr   :=inet_addr(Pchar(edtHostIP.Text));         SocketAddr.sin_port:=htons(StrToInt(edtPort.Text));         Re   :=   connect(socket1,SocketAddr,sizeof(SocketAddr));         if(Re <> 0)then         begin                   StatusBar1.SimpleText:= '连接服务器失败 ';                   exit;         end;         //连接主机成功         StatusBar1.SimpleText:= '连接主机成功 '; end; procedure   TfrmMain.btnDisConnectClick(Sender:   TObject); var         re,err:integer;         info:string; begin         //   关闭         re:=closesocket(socket1);         //   判断关闭socket结果         if   re=SOCKET_ERROR   then         begin                 err:=WSAGetLastError();                 case   err   of                         WSANOTINITIALISED:info:= '请先调用WSAStartup ';                         WSAENETDOWN:info:= '网络子系统失败 ';                         WSAENOTSOCK:info:= '描述符不是socket对象 ';                         WSAEINPROGRESS:info:= 'Socket忙 ';                         WSAEINTR:info:= '通过WSACancelBlockingCall取消操作 ';                         WSAEWOULDBLOCK:info:= '超时值过大 ';                 end;         end         else                 Info:= '成功关闭socket ';         StatusBar1.SimpleText:=info; end; procedure   TfrmMain.btnSendClick(Sender:   TObject); var         Info:string;         BufSend,BufRecv:pchar;         Re:Integer; begin         //发送消息         GetMem(BufSend,1024);         ZeroMemory(BufSend,1024);         Info:=edtSend.Text;         StrPCopy(BufSend,Info);         Re:=send(socket1,BufSend^,Length(BufSend),0);         if(Re=SOCKET_ERROR)then         begin                   StatusBar1.SimpleText:= '发送数据失败 ';                   exit;         end;                                       //接收消息         GetMem(BufRecv,1024);         ZeroMemory(bufRecv,1024);         re   :=   recv(socket1,   BufRecv^,   1024,   0);         Info:=StrPas(bufRecv);         edtEcho.Text:=Info;         //释放pchar变量         FreeMem(BufSend);         FreeMem(BufRecv); end; end.


    最新回复(0)