问题是这样子的
我在form1中定义了一个sk1:tsocket
然后在form2中
用sk1 发送东西 发完后 socket 自动关闭了~
但是在form1中发东西 如果我不运行 closesocket 的话 是不会断掉的
问下 这是怎么回事另我在 form2 里加了个 
uses Unit1;
直接调用 sk1~
这样子应该没问题吧~ 

解决方案 »

  1.   

    单步调试了下~type
      test_array=array[0..211] of Byte;
    var
    re:integer;  
    message_headpack:array[0..3] of Byte;
      test_byte:array[0..207] of Byte;
      send_pack:test_array;
      psend_pack:^test_array;
    ~~~~~~~~~~~~~~~~~~~~
    前边是些赋值语句就不复制了
    for i:=0 to sizeof(message_headpack)-1 do
      send_pack[i]:=message_headpack[i];
    for i:=SizeOf(message_headpack)to SizeOf(send_pack)-1 do
      send_pack[i]:=test_byte[i-sizeof(message_headpack)];
    re:=send(sk1,psend_pack^,Length(psend_pack^),0);
    //单步运行到这一步 就发现信息包发出去后 然后socket也自动关闭了~sk1是套接字~我在unit1中定义的
      if(Re=SOCKET_ERROR)then
      begin
       ShowMessage('发送错误');
       exit;
      end;
     form2.Release;
      close;高手帮我看下
      

  2.   

    加个输出错误信息看下uses
      Winsock2;try
      re:=send(sk1,psend_pack^,Length(psend_pack^),0);
    finally
      ShowMessage(SysErrorMessage(WSAGetLastError()));
    end;
      

  3.   

    最好还是把代码贴完整吧,
    你在UNIT2单位里使用SEND发送前,是否连接成功的? 
      

  4.   

    你好~
    连接是成功的~输出信息加了没有任何提示
    我在unit2中 把东西发送出去后 服务器也接收到了然后socket自动断开了~
    大致代码如下
    unit Unit1;interface
    uses
    WinSock;
    var
    sk1:tsocket;
    .......
    procedure TForm1.FormCreate(Sender: TObject);  //在form1中创建的socket
    var
      wsadata:TWSAData;
      addr:TSockAddr;
    begin
      if (wsastartup(makeword(2,0),wsadata)<>0) then
      begin
      showmessage('winsock初始化失败');
      exit;
      end;
      sk1:=socket(af_inet,sock_stream,ipproto_tcp);
      if (skt=INVALID_SOCKET)then
      begin
        showmessage('创建socket失败');
        exit;
      end;
      ZeroMemory(@addr,sizeof(addr));
      addr.sin_family:=af_inet;
      addr.sin_port:=htons(32734);
      addr.sin_addr.S_addr:=inet_addr('192.168.0.22');
      i:=connect(sk1,addr,sizeof(addr));
      if i<>0 then
      begin
        ShowMessage('连接失败');
        exit;
      end;
    .........unit Unit2;
    .
    implementationuses Unit1;procedure TForm3.sendbtnClick(Sender: TObject);
    type
      test_array=array[0..211] of Byte;
    var
      i,k,re,timeout:Integer;
      radar_data:data_record;  // 这是一个大结构体太长了
      x_string,data_test:string;
      message_headpack:array[0..3] of Byte;
      test_byte:array[0..207] of Byte;
      send_pack:test_array;
      psend_pack:^test_array;
    begin
      //前边是些赋值语句,然后把结构体转成字节数组 就不复制了
      //下来是发送
     re:=send(sk1,psend_pack^,Length(psend_pack^),0);
      //单步运行到这一步 就发现信息包发出去后 然后socket也自动关闭了~  if(Re=SOCKET_ERROR)then
      begin
      ShowMessage('发送错误');
      exit;
      end;