在一次连接中,客户机要想服务器发n个数据包,但没次都是发送完第一个包的时候,第二次connect服务器就报错,无法连接上服务器。我是真的没办法了,求助啊客户机循环发包的代码如下:
  for j:=1 to qry.RecordCount do
    begin
      if (connect(fSocket, client, sizeof(client)) <> 0) then
        begin
          closesocket(FSocket);
          ShowMessage('初始化出错,无法连接到服务器!');
          update_meterchange.Close;
          exit;
        end;        str:=qry.Fields[0].Value ;
        qry.Next ;
        strpcopy(buf, str);
        if send(FSocket, buf, sizeof(buf), 0) < sizeof(str) then
          begin
            closesocket(FSocket);
            ShowMessage('数据发送失败');
            update_meterchange.Close;
            exit;
          end ;
      fillchar(buf, sizeof(buf),#0);
      timeout_b:=1;    //开始计时
      recvlen:=recv(FSocket,buf,sizeof(buf),0) ;
      timeout_b:=0;    //停止计时
        if (recvlen>0)  then
           begin
             mainform.Memo1.Lines.Add(Parsereply(copy(buf,0,recvlen)));
           end
         else
           begin
             closesocket(FSocket);
             showmessage('设置失败');
             mainform.Memo1.Lines.Add('设置失败,连接超时!');
             update_meterchange.Close;
             exit;
           end;
      end;
         closesocket(FSocket);
         update_meterchange.Close;
         exit;

解决方案 »

  1.   

    服务器端的代码如下:
        Global_Sock_Accept := socket(AF_INET, SOCK_STREAM, 0);
        if (Global_Sock_Accept = SOCKET_ERROR) then
        begin
          ShowMessage('初始化出错,无法创建SOCK!');
          exit;
        end;    //4.绑定
        if (bind(Global_Sock_Accept, server_addr, sizeof(server_addr)) <> 0) then
        begin
          showmessage('初始化出错,无法绑定!');
          exit;
        end;
        //5.监听
        if (listen(Global_Sock_Accept, 5) <> 0) then
        begin
          showmessage('初始化出错,无法监听!');
          exit;
        end;    form1.Memo2.Lines.Add('服务器启动成功!') ;    while (not false) do
        begin
          i := sizeof(client_addr);
          fillchar(client_addr, i, 0);     
          ns := accept(Global_Sock_Accept, addr(client_addr), addr(i));
          if ns=-1 then
            begin
             form1.Memo2.Lines.Add('socket error');
             exit;
            end;
          fillchar(rbuf, sizeof(rbuf), #0);
          recvlen:=recv(ns,rbuf,sizeof(rbuf),0) ;    //接收消息
          if recvlen>0 then
           begin
              form1.Memo2.Lines.Add(datetimetostr(now())+'   '+copy(rbuf,0,recvlen));
           end;  str:=form1.edit3.text;
      fillchar(rbuf, sizeof(rbuf), ' ');
      strpcopy(rbuf, str);
      if send(ns, rbuf, sizeof(rbuf), 0) < sizeof(str) then  //收到后回复
        begin
          form1.Memo2.Lines.Add('数据发送失败');
          exit;
        end
      else
        begin
          form1.Memo2.Lines.Add('发送包内容:'+str);
        end;
       closesocket(ns);
       end;
      

  2.   

    程序是没有出错的
    就是客户机在connect(fSocket, client, sizeof(client)) 时返回0,也就是连接服务器失败55555为什么会这样呢!!!!!
      

  3.   

    for j:=1 to qry.RecordCount-1 do
      

  4.   

    你服务器的代码应该是有问题啦,试试下面的代码
    服务器端的代码如下:
        Global_Sock_Accept := socket(AF_INET, SOCK_STREAM, 0);
        if (Global_Sock_Accept = SOCKET_ERROR) then
        begin
          ShowMessage('初始化出错,无法创建SOCK!');
          exit;
        end; 
        if (bind(Global_Sock_Accept, server_addr, sizeof(server_addr)) <> 0) then
        begin
          showmessage('初始化出错,无法绑定!');
          exit;
        end;    if (listen(Global_Sock_Accept, 5) <> 0) then
        begin
          showmessage('初始化出错,无法监听!');
          exit;
        end;    form1.Memo2.Lines.Add('服务器启动成功!') ;    while (not false) do
        begin
          i := sizeof(client_addr);
          fillchar(client_addr, i, 0);     
          ns := accept(Global_Sock_Accept, addr(client_addr), addr(i));
          if ns=-1 then
            begin
             form1.Memo2.Lines.Add('socket error');
             exit;
            end;
          fillchar(rbuf, sizeof(rbuf), #0);
          recvlen:=recv(ns,rbuf,sizeof(rbuf),0) ;    //接收消息
          if recvlen>0 then
           begin
              form1.Memo2.Lines.Add(datetimetostr(now())+'   '+copy(rbuf,0,recvlen));
           end;  str:=form1.edit3.text;
      fillchar(rbuf, sizeof(rbuf), ' ');
      strpcopy(rbuf, str);
      if send(ns, rbuf, sizeof(rbuf), 0) < sizeof(str) then 
        begin
          form1.Memo2.Lines.Add('数据发送失败');
          exit;
        end
      else
        begin
          form1.Memo2.Lines.Add('发送包内容:'+str);
        end;
       closesocket(ns);
       end;