求助:serversocket 出错 1:这个错误,Windows Socket Error : 由于套接字没有连接并且(当使用一个sendto调用发送数据报套接字时)没有提供地址,发送或接受数据的请求没有被接受。(10057),on API 'send'如何解决 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 源代码如下:interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ScktComp,Winsock, ExtCtrls, NMUDP;const CMax=10; //客户端最大连接数type client_record=record CHandle: integer; //客户端套接字句柄 CSocket:TCustomWinSocket; //客户端套接字 CName:string; //客户端计算机名称 CAddress:string; //客户端计算机IP地址 CUsed: boolean; //客户端联机标志 end;type TForm1 = class(TForm) Memo1: TMemo; ServerSocket1: TServerSocket; Button1: TButton; Button2: TButton; Button3: TButton; Edit1: TEdit; Edit2: TEdit; NMUDP1: TNMUDP; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocket1ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocket1GetSocket(Sender: TObject; Socket: Integer; var ClientSocket: TServerClientWinSocket); procedure ServerSocket1Listen(Sender: TObject; Socket: TCustomWinSocket); procedure Timer1Timer(Sender: TObject); procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String; Port: Integer); procedure NMUDP1DataSend(Sender: TObject); procedure NMUDP1InvalidHost(var handled: Boolean); procedure NMUDP1Status(Sender: TComponent; status: String); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } server:TSOCKET; public { Public declarations } session: array[0..CMax] of client_record; //客户端连接数组 Sessions: integer; end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);beginif (edit1.Text='') or (edit2.Text='') thenbeginshowmessage('输入完整的服务器的地址信息!!!');endelsebegin Timer1.Enabled:=true; ServerSocket1.Active:=false;end;end;procedure TForm1.Button2Click(Sender: TObject);var SendBuf:array [1..8] of byte; //发送下行报文(读CDT配置)j:integer;sendstr:string;begin SendBuf[1]:=byte($0A); SendBuf[2]:=byte($81); SendBuf[3]:=byte($28); SendBuf[4]:=byte($00); SendBuf[5]:=byte($FE); SendBuf[6]:=byte($C0); SendBuf[7]:=byte($00); SendBuf[8]:=byte($00);for j:=1 to 8 dobegin sendstr:=sendstr+' '+inttohex(SendBuf[j],2);end;if not serversocket1.Socket.Connected thenbegin serversocket1.Socket.Connect(server);end;ServerSocket1.Socket.SendText(sendstr);memo1.Lines.Add('发送'+sendstr);end;procedure TForm1.Button3Click(Sender: TObject);varj:integer;Rcvstr:string;RcvBuf:array [1..8] of byte;beginServerSocket1.Socket.ReceiveBuf(RcvBuf,8); for j:=1 to 8 do begin Rcvstr:=Rcvstr+' '+inttohex(RcvBuf[j],2); end; memo1.Lines.Add('接受'+Rcvstr);end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin ServerSocket1.Close;end;procedure TForm1.ServerSocket1Listen(Sender: TObject; Socket: TCustomWinSocket);begin memo1.Lines.Add('等待建立TCP连接...');end;procedure TForm1.ServerSocket1GetSocket(Sender: TObject; Socket: Integer; var ClientSocket: TServerClientWinSocket);begin memo1.Lines.Add('正在建立连接...');end;procedure TForm1.ServerSocket1ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);begin memo1.Lines.Add('与'+Socket.RemoteHost +'链接发生错误!'+ inttostr(ErrorCode)); ErrorCode := 0;end;procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);var i:integer;begin for i:=0 to sessions do begin if session[i].CHandle =Socket.SocketHandle then begin session[i].CHandle :=0; session[i].CUsed := False; Break; end; end; memo1.Lines.Add('与 '+Socket.RemoteHost + '链接已经断开');end;procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);var i,j:integer;begin j:=-1; for i:=0 to sessions do begin //在原有的客户端连接数组中有中断的客户端连接 if not session[i].CUsed then begin session[i].CHandle := Socket.SocketHandle ;//客户端套接字句柄 session[i].CSocket := Socket; //客户端套接字 session[i].CName := Socket.RemoteHost ; //客户端计算机名称 session[i].CAddress := Socket.RemoteAddress ;//客户端计算机IP session[i].CUsed := True; //连接数组当前位置已经占用 Break; end; j:=i; end; if j=sessions then begin inc(sessions); session[j].CHandle := Socket.SocketHandle ; session[j].CSocket := Socket; session[j].CName := Socket.RemoteHost ; session[j].CAddress := Socket.RemoteAddress ; session[j].CUsed := True; end; memo1.Lines.Add('与 '+Socket.RemoteHost + ' 已经建立连接'); //NMUDP1.Free; TIMER1.Enabled:=false;end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);var i:integer;begin //将从客户端读取的信息添加到Memo1中 Memo1.Lines.Add('接受数据'+Socket.ReceiveText); for i:=0 to sessions do begin //取得匹配的客户端 if session[i].CHandle = Socket.SocketHandle then begin session[i].CSocket.SendText('回复客户端'+session[i].CAddress+' ==> '+Edit1.Text); end; end;end;procedure TForm1.Timer1Timer(Sender: TObject);var i:integer; MyStream: TStringStream; TmpStr: String; sendbuff:array[0..5] of byte;begin TmpStr:=''; NMUDP1.RemoteHost := edit1.text; NMUDP1.ReportLevel := Status_Basic; NMUDP1.LocalPort :=strtoint(edit2.Text); NMUDP1.RemotePort :=strtoint(edit2.Text); sendbuff[0]:=byte($55); sendbuff[1]:=byte($AA); sendbuff[2]:=byte($55); sendbuff[3]:=byte($AA); sendbuff[4]:=byte($55); sendbuff[5]:=byte($AA); for i:=0 to 5 dobegin TmpStr:=TmpStr+inttohex(sendbuff[i],2);end; MyStream := TStringStream.Create(TmpStr);try MyStream.Write(TmpStr[1], Length(TmpStr)); NMUDP1.SendStream(MyStream);finally MyStream.Free;end;end;procedure TForm1.NMUDP1InvalidHost(var handled: Boolean);begin NMUDP1.RemoteHost:=Edit1.Text; Handled := TRUE;end;procedure TForm1.NMUDP1Status(Sender: TComponent; status: String);begin memo1.Lines.Add('UDP connecting...') ;end;procedure TForm1.NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String; Port: Integer);var MyStream: Tstringstream; TmpStr: String;begin FromIP:=NMUDP1.RemoteHost; Port:=NMUDP1.RemotePort;MyStream := Tstringstream.Create(TmpStr); try NMUDP1.ReadStream(MyStream); SetLength(TmpStr,NumberBytes); MyStream.Read(TmpStr[1],NumberBytes); memo1.Lines.add('接受数据:来自'+FromIP+'/'+inttostr(Port)+' : '+TmpStr); ServerSocket1.Active:=true;finally MyStream.Free; Timer1.Enabled:=false;end;end;procedure TForm1.NMUDP1DataSend(Sender: TObject);begin Timer1.Enabled:=true;end;procedure TForm1.FormCreate(Sender: TObject);begin Timer1.Enabled:=false; serversocket1.Active:=false;end;procedure TForm1.FormDestroy(Sender: TObject);beginNMUDP1.Free;end;end. 要求:程序开始运行以后,一直通过UDP协议发送55AA55AA55AA。一直等到对方收到以后,就主动向我的程序通过TCP协议建立连接。我监听到以后,就关闭UDP,利用TCP和对方进行数据的上传和下载。 一个字符串的问题!!!!! 类似泡泡的一个小游戏,请大哥们帮帮我!!!给我一个思路啊~~ SQL语句在Sql server中没问题,在Access中有问题了,保证是标准的SQL语句! 请教如何设计调整大小的小方块呢? 下载进度条问题 说难不难说易我真的不会关于Panel的使用,来帮忙UP 关于数据库打包的问题,请老鸟回答 急急!如何实现多个Timage或Tpicture对象实例的联合输出成图片形式?50分奉送!!谢谢 请问怎样打开一个外部文件? 我的软件出了新版本,希望大家能捧捧场 一个尚待确定的问题 如何让MASKEDIT显示“2003年06月03日”呢,通过微调能过调整年月日?
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp,Winsock, ExtCtrls, NMUDP;
const
CMax=10; //客户端最大连接数
type
client_record=record
CHandle: integer; //客户端套接字句柄
CSocket:TCustomWinSocket; //客户端套接字
CName:string; //客户端计算机名称
CAddress:string; //客户端计算机IP地址
CUsed: boolean; //客户端联机标志
end;
type
TForm1 = class(TForm)
Memo1: TMemo;
ServerSocket1: TServerSocket;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Edit1: TEdit;
Edit2: TEdit;
NMUDP1: TNMUDP;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1GetSocket(Sender: TObject; Socket: Integer;
var ClientSocket: TServerClientWinSocket);
procedure ServerSocket1Listen(Sender: TObject;
Socket: TCustomWinSocket);
procedure Timer1Timer(Sender: TObject);
procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String; Port: Integer);
procedure NMUDP1DataSend(Sender: TObject);
procedure NMUDP1InvalidHost(var handled: Boolean);
procedure NMUDP1Status(Sender: TComponent; status: String);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
server:TSOCKET;
public
{ Public declarations }
session: array[0..CMax] of client_record; //客户端连接数组
Sessions: integer; end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
if (edit1.Text='') or (edit2.Text='') then
begin
showmessage('输入完整的服务器的地址信息!!!');
end
else
begin Timer1.Enabled:=true;
ServerSocket1.Active:=false;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
SendBuf:array [1..8] of byte; //发送下行报文(读CDT配置)
j:integer;
sendstr:string;
begin
SendBuf[1]:=byte($0A);
SendBuf[2]:=byte($81);
SendBuf[3]:=byte($28);
SendBuf[4]:=byte($00);
SendBuf[5]:=byte($FE);
SendBuf[6]:=byte($C0);
SendBuf[7]:=byte($00);
SendBuf[8]:=byte($00);
for j:=1 to 8 do
begin
sendstr:=sendstr+' '+inttohex(SendBuf[j],2);
end;
if not serversocket1.Socket.Connected then
begin
serversocket1.Socket.Connect(server);
end;
ServerSocket1.Socket.SendText(sendstr);
memo1.Lines.Add('发送'+sendstr);
end;procedure TForm1.Button3Click(Sender: TObject);
var
j:integer;
Rcvstr:string;
RcvBuf:array [1..8] of byte;
begin
ServerSocket1.Socket.ReceiveBuf(RcvBuf,8);
for j:=1 to 8 do
begin
Rcvstr:=Rcvstr+' '+inttohex(RcvBuf[j],2);
end;
memo1.Lines.Add('接受'+Rcvstr);
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ServerSocket1.Close;
end;procedure TForm1.ServerSocket1Listen(Sender: TObject;
Socket: TCustomWinSocket);
begin
memo1.Lines.Add('等待建立TCP连接...');
end;procedure TForm1.ServerSocket1GetSocket(Sender: TObject; Socket: Integer;
var ClientSocket: TServerClientWinSocket);
begin
memo1.Lines.Add('正在建立连接...');
end;procedure TForm1.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
memo1.Lines.Add('与'+Socket.RemoteHost +'链接发生错误!'+ inttostr(ErrorCode));
ErrorCode := 0;end;procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
i:integer;
begin
for i:=0 to sessions do
begin
if session[i].CHandle =Socket.SocketHandle then
begin
session[i].CHandle :=0;
session[i].CUsed := False;
Break;
end;
end;
memo1.Lines.Add('与 '+Socket.RemoteHost + '链接已经断开');
end;procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
i,j:integer;
begin
j:=-1;
for i:=0 to sessions do
begin
//在原有的客户端连接数组中有中断的客户端连接
if not session[i].CUsed then
begin
session[i].CHandle := Socket.SocketHandle ;//客户端套接字句柄
session[i].CSocket := Socket; //客户端套接字
session[i].CName := Socket.RemoteHost ; //客户端计算机名称
session[i].CAddress := Socket.RemoteAddress ;//客户端计算机IP
session[i].CUsed := True; //连接数组当前位置已经占用
Break;
end;
j:=i;
end;
if j=sessions then
begin
inc(sessions);
session[j].CHandle := Socket.SocketHandle ;
session[j].CSocket := Socket;
session[j].CName := Socket.RemoteHost ;
session[j].CAddress := Socket.RemoteAddress ;
session[j].CUsed := True;
end;
memo1.Lines.Add('与 '+Socket.RemoteHost + ' 已经建立连接');
//NMUDP1.Free;
TIMER1.Enabled:=false;
end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
i:integer;
begin
//将从客户端读取的信息添加到Memo1中
Memo1.Lines.Add('接受数据'+Socket.ReceiveText);
for i:=0 to sessions do
begin
//取得匹配的客户端
if session[i].CHandle = Socket.SocketHandle then
begin
session[i].CSocket.SendText('回复客户端'+session[i].CAddress+' ==> '+Edit1.Text);
end;
end;
end;procedure TForm1.Timer1Timer(Sender: TObject);
var
i:integer;
MyStream: TStringStream;
TmpStr: String;
sendbuff:array[0..5] of byte;
begin
TmpStr:='';
NMUDP1.RemoteHost := edit1.text;
NMUDP1.ReportLevel := Status_Basic;
NMUDP1.LocalPort :=strtoint(edit2.Text);
NMUDP1.RemotePort :=strtoint(edit2.Text);
sendbuff[0]:=byte($55);
sendbuff[1]:=byte($AA);
sendbuff[2]:=byte($55);
sendbuff[3]:=byte($AA);
sendbuff[4]:=byte($55);
sendbuff[5]:=byte($AA);
for i:=0 to 5 do
begin
TmpStr:=TmpStr+inttohex(sendbuff[i],2);
end;
MyStream := TStringStream.Create(TmpStr);
try
MyStream.Write(TmpStr[1], Length(TmpStr));
NMUDP1.SendStream(MyStream);
finally
MyStream.Free;
end;
end;procedure TForm1.NMUDP1InvalidHost(var handled: Boolean);
begin
NMUDP1.RemoteHost:=Edit1.Text;
Handled := TRUE;
end;procedure TForm1.NMUDP1Status(Sender: TComponent; status: String);
begin
memo1.Lines.Add('UDP connecting...') ;
end;
procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
MyStream: Tstringstream;
TmpStr: String;
begin
FromIP:=NMUDP1.RemoteHost;
Port:=NMUDP1.RemotePort;
MyStream := Tstringstream.Create(TmpStr);
try
NMUDP1.ReadStream(MyStream);
SetLength(TmpStr,NumberBytes);
MyStream.Read(TmpStr[1],NumberBytes);
memo1.Lines.add('接受数据:来自'+FromIP+'/'+inttostr(Port)+' : '+TmpStr);
ServerSocket1.Active:=true;
finally
MyStream.Free;
Timer1.Enabled:=false;
end;
end;
procedure TForm1.NMUDP1DataSend(Sender: TObject);
begin
Timer1.Enabled:=true;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Enabled:=false;
serversocket1.Active:=false;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
NMUDP1.Free;
end;end.