在一次连接中,客户机要想服务器发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;
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;
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;
就是客户机在connect(fSocket, client, sizeof(client)) 时返回0,也就是连接服务器失败55555为什么会这样呢!!!!!
服务器端的代码如下:
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;