和我的问题一样了~呵呵,不过我能实现广播,但发送到一个计算机上就不行了~

解决方案 »

  1.   

    可以的,给你们一个例子看看。unit testEchoMain;interfaceuses
      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.