因为涉及不同OS平台不同语言问题,请大家帮忙,谢谢

解决方案 »

  1.   

    unit udp;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, winsock,
      StdCtrls;const
      WM_SOCK = WM_USER + 1;     //自定义windows消息
      UDPPORT = 646;            //设定UDP端口号type
      Tfrmmain = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Memo1: TMemo;
        Edit2: TEdit;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
        s: TSocket;
        addr: TSockAddr;
        FSockAddrIn : TSockAddrIn;
            //利用消息实时获知UDP消息
        procedure ReadData(var Message: TMessage);
                message WM_SOCK;
      public
        { Public declarations }
        procedure SendData(Content: String);
      end;var
      frmmain: Tfrmmain;implementation{$R *.DFM}procedure Tfrmmain.FormCreate(Sender: TObject);
    var
       TempWSAData: TWSAData;
       //optval: integer;
    begin
    // 初始化SOCKET
         if WSAStartup($101, TempWSAData)=1 then
            showmessage('StartUp Error!');     s := Socket(AF_INET, SOCK_DGRAM, 0);
         if (s = INVALID_SOCKET) then   //Socket创建失败
         begin
              showmessage(inttostr(WSAGetLastError())+'  Socket创建失败');
              CloseSocket(s);
    //          exit;
         end;
         //发送方SockAddr绑定
         addr.sin_family := AF_INET;
         addr.sin_addr.S_addr := INADDR_ANY;
         addr.sin_port := htons(UDPPORT);
         if Bind(s, addr, sizeof(addr)) <> 0  then
           begin
             showmessage('bind fail');
           end;
         {optval:= 1;
         if setsockopt(s,SOL_SOCKET,SO_BROADCAST,pchar(@optval),sizeof(optval)) = SOCKET_ERROR then
         begin
           showmessage('无法进行UDP广播');
         end;}
         WSAAsyncSelect(s, frmmain.Handle , WM_SOCK, FD_READ);
         //接收端SockAddrIn设定
         FSockAddrIn.SIn_Family := AF_INET;
         FSockAddrIn.SIn_Port := htons(UDPPORT);
         label3.Caption := '端口:'+inttostr(UDPPORT);
    end;procedure Tfrmmain.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
        CloseSocket(s);
    end;procedure Tfrmmain.ReadData(var Message: TMessage);
    var
       buffer: Array [1..4096] of char;
       len: integer;
       flen: integer;
       Event: word;
       value: string;
    begin
         flen:=sizeof(FSockAddrIn);
         FSockAddrIn.SIn_Port := htons(UDPPORT);
         Event := WSAGetSelectEvent(Message.LParam);
         if Event = FD_READ then
         begin
              len := recvfrom(s, buffer, sizeof(buffer), 0, FSockAddrIn, flen);
              value := copy(buffer, 1, len);
              Memo1.Lines.add(value)
         end;
    end;procedure Tfrmmain.SendData(Content: String);
    var
       value{,hostname}: string;
       len: integer;
    begin     FSockAddrIn.SIn_Addr.S_addr := inet_addr(pchar(Edit1.text)); //INADDR_BROADCAST;   //INADDR_BROADCAST = -1 ?
         value := Content;
         len := sendto(s, value[1], Length(value), 0, FSockAddrIn, sizeof(FSockAddrIn));
         if (WSAGetLastError() <> WSAEWOULDBLOCK) and (WSAGetLastError() <> 0) then
            showmessage(inttostr(WSAGetLastError()));
         if len = SOCKET_ERROR then
            showmessage('send fail');
         if len <> Length(value) then
            showmessage('Not Send all');
    end;procedure Tfrmmain.Button1Click(Sender: TObject);
    begin
         senddata(Edit2.text);
    end;end.
      

  2.   

    用控件也没问题的,控件只是封装接口而已,他不可能自己跑出一套协议来。
    多种语言用就是了,我用delphi 连 bcb vc都没问题