当前位置:首页 » 云服务器 » sio服务器地址

sio服务器地址

发布时间: 2022-09-18 17:23:51

① USB转PS/2转接口支持热拔插吗PS/2这头插主板上

不支持,需重新启动才可生效,USB可随插随拔

② DELPHI上简单高效的SOCKET控件怎么选择

主要用异步通讯方式
直接api,winsock

参考之:


  • Delphi(Pascal) code
  • 下面是一个简单的Socket通信程序,其中客户机和服务机是同一个程序,当客户机(服务器)在一个memo1中输入一段文字然后敲入回车,该段文字就可以显示在服务器(客户机)的memo2中,反之亦成立。具体步骤如下:

  • 1、新建一个form,任意命名,不妨设之为chatForm;放上一个MainMenu(在Standard栏中),建立ListenItem、ConnectItem、Disconnect和Exit菜单项;在从Internet栏中选择TServerSocket、TClientSocket添加到chatForm中,其中把TClientSocket的名字设为ClientSocket, port设为1025,默认的active为false;把TServerSocket的名字设为ServerSocket,port设为1025,默认的active为false,其他的不变;再放入两个memo,一个命名为memo1,另外一个命名为memo2,其中把memo2的color设置为灰色,因为主要用来显示对方的输入。下面我们一边编写代码一边解? 因。

  • 2、双击ListemItem。写入如下代码:

  • procere TChatForm.ListenItemClick(Sender: TObject);

  • begin

  • ListenItem.Checked := not ListenItem.Checked;

  • if ListenItem.Checked then

  • begin

  • ClientSocket.Active := False;

  • ServerSocket.Active := True;

  • end

  • else

  • begin

  • if ServerSocket.Active then

  • ServerSocket.Active := False;

  • end;

  • end;

  • 该程序段的说明如下:当用户选择ListemItem时,该ListenItem取反,如果选中的话,说明处于Listen状态,读者要了解的是:listen是Socket作为Server时一个专有的方法,如果处于listen,则ServerSocket设置为活动状态;否则,取消listen,则关闭ServerSocket。实际上,只有用户一开始选择该菜单项,表明该程序用作Server。反之,如果用户选择ConnectItem,则必然作为Client使用。

  • 3、双击ConnectItem,敲入以下代码。

  • procere TChatForm.ConnectItemClick(Sender: TObject);

  • begin

  • if ClientSocket.Active then ClientSocket.Active := False;

  • if InputQuery(Computer to connect to, Address Name:, Server) then

  • if Length(Server) $#@62; 0 then

  • with ClientSocket do

  • begin

  • Host := Server;

  • Active := True;

  • ListenItem.Checked := False;

  • end;

  • end;

  • 这段程序的主要功能就是当用户选择ConnectItem菜单项时,设置应用程序为客户机,弹出input框,让用户输入服务器的地址。这也就是我们不一开始固定ClientSocket的host的原因,这样用户可以动态地连接不同的服务器。读者需要了解的是主机地址只是Socket作为客户机时具有的一个属性,Socket作为服务器时“一般“不用地址,因为它同本机绑定。

  • 4、在memo1的keydown方法中写入如下代码:

  • procere TChatForm.Memo1KeyDown(Sender: TObject; var Key: Word;

  • Shift: TShiftState);

  • begin

  • if Key = VK_Return then

  • if IsServer then

  • ServerSocket.Socket.Connections[0].SendText(Memo1.Lines[Memo1.Lines.Count - 1])

  • else

  • ClientSocket.Socket.SendText(Memo1.Lines[Memo1.Lines.Count - 1]);

  • end;

  • 该段代码的作用很明显,就是开始发消息了。其中如果是Server的话,它只向第一个客户机发消息,由于一个服务器可以连接多个客户机,而同客户机的每一个连接都由一个Socket来维持,因此ServerSocket.Socket.Connnections数组中存储的就是同Client维持连接的Socket。在标准Socket中,服务器方的Socket通过accept()方法的返回值获取维持同客户机连接的Socket,而发送、接受消息的方法分别为send(sendto)和recv(recvfrom), Delphi对此进行了封装。

  • 5、其余代码的简要介绍。

  • procere TChatForm.ServerSocketAccept(Sender: TObject;

  • Socket: TCustomWinSocket);

  • begin

  • IsServer := True;

  • end;

  • ServerSocket的Accept方法,当客户机第一次连接时完成,通过其参数可以认为,它是在标准的accept方法后执行的,因为有TCustomWinSocket这个参数类型,它应该是标准Server方Socket的返回值。

  • procere TChatForm.ClientSocketRead(Sender: TObject;

  • Socket: TCustomWinSocket);

  • begin

  • Memo2.Lines.Add(Socket.ReceiveText);

  • end;


  • procere TChatForm.ServerSocketClientRead(Sender: TObject;

  • Socket: TCustomWinSocket);

  • begin

  • Memo2.Lines.Add(Socket.ReceiveText);

  • end;

  • 这两段代码分别是服务器方和客户机方在收到对方的消息时,由Delphi触发的,作用是在memo2中显示收到的消息。其中,ClientSocketRead中的Socket实际上就是Socket本身,而在ServerSocketClientRead中的Socket实际上是ServerSocket.Socket.Connection[]中的某个Socket。不过在Delphi中,对服务器方的Socket进行了有效的封装。

  • procere TChatForm.ServerSocketClientConnect(Sender: TObject;

  • Socket: TCustomWinSocket);

  • begin

  • Memo2.Lines.Clear;

  • end;

  • procere TChatForm.ClientSocketDisconnect(Sender: TObject;

  • Socket: TCustomWinSocket);

  • begin

  • ListenItemClick(nil);

  • end;

  • 这两段比较简单。其中ServerSocketClientConnect在ServerSocket收到一个新的连接时触发。而ClientSocketDisconnect在ClientSocket发出Disconncet时触发。


  • procere TChatForm.Exit1Click(Sender: TObject);

  • begin

  • ServerSocket.Close;

  • ClientSocket.Close;

  • Close;

  • end;

  • procere TChatForm.Disconnect1Click(Sender: TObject);

  • begin

  • ClientSocket.Active := False;

  • ServerSocket.Active := True;

  • end;

  • 第一段为关闭应用程序。在标准Socket中,每个Socket在关闭时,必须调用closesocket()方法,否则系统不会释放资源。而在ServerSockt.Close和ClientSocket.Close中,系统内部肯定调用了closesocket()方法。

  • 三、标准Socket与Delphi中的Socket。

  • 标准的Socket的应用程序框架如下:

  • Server方: Socket()[ 新建一个Socket]--Bind()[ 同服务器地址邦定 ]--Listen() --Accept()--block wait--read()[接受消息,在windows平台中,方法为send(TCP),或者是sendto(UDP)]--处理服务请求--Write()[发送消息,在windows平台中,方法为send(TCP), 或者为sendto(UDP)。

  • Client方相对简单:Socket()--Connect()[通过一定的port连接特定的服务器,这是与服务器建立连接]--Write()--Read()。

  • Socket可以是基于TCP的,也可以是基于UDP,同时Socket甚至建立在其他的协议,比如IPX/SPX,DECNet等。在新建一个Socket时,可以指定新建何类Socket。Bind()用来同服务器的地址邦定,如果一个主机只有一个IP地址,实际上邦定的作用就相对多余了。Listen()开始监听网络,Accept()用于接受连接,其返回值是保持同客户机联系的Socket。

  • 在Delphi中,对于Windows中的Socket进行了有效的封装。在Delphi中,按其继承关系,可以分层两类:

  • 一、TComponent--TAbstractSocket--TCustomSocket--TCustomServerSocket--TServerSocket

  • TComponent--TAbstractSocket--TCustomSocket--TClientSocket

  • 二、直接从TObject继承过来:

  • TObject--TCustomWinSocket--TServerWinSocket

  • TObject--TCustomWinSocket--TClientWinSocket

  • TObject--TCustomWinSocket--TServerClientWinSocket

  • 可以看出第一类建立在TCustomSocket基础上,第二类建立在TCustomWinSocket的基础上。第一类建立在TComponet的基础上,第二类直接构建在TObject基础上。因此如果用户非常熟悉Socket并且想要编写控制台程序时,可以使用TCustomWinScoket类。

  • 同uses中可以看出,它们都在ScktComp.pas中实现,而在schtComp.pas中,则包含了winsock.pas文件,如果继续深入winsock文件,在其中可以发现所有的Windows Socket的基本方法。


  • 实际上,如果你了解了标准Socket的应用程序框架,对于使用Delphi编写Socket应用程序也就得心应手了;这不是说你必须了解复杂的Socket中的标准函数,也没有必要,因为Delphi已经为你做了很好的封装了,这也正是Delphi的强势所在,你只要了解那么一点点的基本框架。

  • 这是我对Delphi中的Socket应用的理解,不足之处希望大家指正。同时也乐于为大家解答Delphi中有关Socket的问题。

SOCKET控件与直接使用API相比

Windows自带的Tracert是向远程主机发送ICMP包进行追踪,但是目前很多主机关闭了ICMP答复,这个工具不太好使了~~~~~原理咱知道,正规的Trace不就是发送TTL依次递增的UDP包吗?什么网关和路由敢随意丢弃我们的UDP包而不通知我们?ICMP包你可以不理,但是UDP包~~~~~不怕黑你???

unit YRecords;

interface

uses
Windows;

const
PACKET_SIZE = 32;
MAX_PACKET_SIZE = 512;
TRACE_PORT = 34567;
LOCAL_PORT = 5555;

type
s32 = Integer;
u32 = DWORD;
u8 = Byte;
u16 = word; PU16 = ^U16;

//
//IP Packet Header
//
PIPHeader = ^YIPHeader;
YIPHeader = record
u8verlen : u8;//4bits ver, 4bits len, len*4=true length
u8tos : u8;//type of service, 3bits 优先权(现在已经被忽略), 4bits TOS, 最多只能有1bit为1
u16totallen : u16;//整个IP数据报的长度,以字节为单位。
u16id : u16;//标识主机发送的每一份数据报。
u16offset : u16;//3bits 标志,13bits片偏移
u8ttl : u8;//生存时间字段设置了数据报可以经过的最多路由器数。
u8protol : u8;//协议类型,6表示传输层是TCP协议。
u16checksum : u16;//首部检验和。
u32srcaddr : u32;//源IP地址,不是‘xxx.xxx.xxx.xxx’的形势哦
u32destaddr : u32;//目的IP地址,同上
end;

//
//ICMP Packet Header
//
PICMPHeader = ^YICMPHeader;
YICMPHeader = record
u8type : u8;
u8code : u8;
u16chksum : u16;
u16id : u16;
u16seq : u16;
end;

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, YRecords, winsock2;

type
TForm1 = class(TForm)
ListBox1: TListBox;
Edit1: TEdit;
Button1: TButton;
procere FormCreate(Sender: TObject);
procere FormClose(Sender: TObject; var Action: TCloseAction);
procere Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function DecodeIcmpReply( pbuf: PChar; var seq: s32 ): string;
var
pIpHdr : PChar;
pIcmphdr : PICMPHeader;
sip : string;
ttl : integer;
begin
pIpHdr := pbuf;
sip := inet_ntoa( TInAddr( PIPHeader(pIpHdr)^.u32srcaddr ) );
ttl := PIPHeader(pIpHdr)^.u8ttl;

Inc( pIpHdr, (PIPHeader(pIpHdr)^.u8verlen and $0F) * 4 );
pIcmpHdr := PICMPHeader(pIpHdr);

result := ;
if pIcmpHdr^.u8type = 3 then //目的不可达信息,Trace完成
seq := 0;
if pIcmpHdr^.u8type = 11 then //超时信息,正在Trace
result := Format( %4d%32s%8d, [seq, sip, ttl] );
end;

procere ErrMsg( msg: string );
begin
MessageBox( 0, PChar(msg), Ping Program Error, MB_ICONERROR );
end;

procere TForm1.FormCreate(Sender: TObject);
var
wsa : TWSAData;
begin
if WSAStartup( $0202, wsa ) <> 0 then
ErrMsg( Windows socket is not responed. );
ListBox1.Font.Name := Courier New;
ListBox1.Font.Size := 9;
end;

procere TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if WSACleanup <> 0 then
ErrMsg( Windows socket can not be closed. );
end;

procere TForm1.Button1Click(Sender: TObject);
const
SIO_RCVALL = IOC_IN or IOC_VENDOR or 1;
var
rawsock : TSocket;
pRecvBuf : PChar;
FromAdr : TSockAddr;
FromLen : s32;
fd_read : TFDSet;
timev : TTimeVal;
sReply : string;
udpsock : TSocket;
ret : s32;
DestAdr : TSockAddr;
pSendBuf : PChar;
ttl, opt : s32;
pHost : PHostEnt;
begin
//创建一个RAWSOCK接收回应ICMP包
rawsock := socket( AF_INET, SOCK_RAW, IPPROTO_ICMP );

FromAdr.sin_family := AF_INET;
FromAdr.sin_port := htons(0);
FromAdr.sin_addr.S_addr := inet_addr(192.168.1.12); //换成你的IP

//如果不bind就无法接收包了~~~因为下面还要创建一个UDPSOCK
bind( rawsock, @FromAdr, SizeOf(FromAdr) );

Opt := 1;
WSAIoctl( rawsock, SIO_RCVALL, @Opt, SizeOf(Opt), nil, 0, @ret, nil, nil );

//接收ICMP回应包的缓冲区
pRecvBuf := AllocMem( MAX_PACKET_SIZE );

//创建一个UDPSOCK发送探测包
udpsock := socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );

//要发送的UDP数据
pSendBuf := AllocMem( PACKET_SIZE );
FillChar( pSendBuf^, PACKET_SIZE, C );

FillChar( DestAdr, sizeof(DestAdr), 0 );
DestAdr.sin_family := AF_INET;
DestAdr.sin_port := htons( TRACE_PORT );
DestAdr.sin_addr.S_addr := inet_addr( PChar(Edit1.Text) );

//如果edit1.text不是IP地址,则尝试解析域名
if DestAdr.sin_addr.S_addr = INADDR_NONE then
begin
pHost := gethostbyname( PChar(Edit1.Text) );
if pHost <> nil then
begin
move( pHost^.h_addr^^, DestAdr.sin_addr, pHost^.h_length );
DestAdr.sin_family := pHost^.h_addrtype;
DestAdr.sin_port := htons( TRACE_PORT );
ListBox1.Items.Add( Edit1.Text +IP地址->+ inet_ntoa(DestAdr.sin_addr) );
end else
begin
ListBox1.Items.Add( 解析域名: + Edit1.Text + 出错。 );
closesocket( rawsock );
closesocket(udpsock);
FreeMem( pSendBuf );
FreeMem( pRecvBuf );
exit;
end;
end;

ListBox1.Items.Add( Trace route + Edit1.Text + ...... );
Listbox1.Update;

//开始Trace!!!
ttl := 1;
while True do
begin
//设置TTL,使我们发送的UDP包的TTL依次累加
setsockopt( udpsock, IPPROTO_IP, IP_TTL, @ttl, sizeof(ttl) );
//发送UDP包到HOST
sendto( udpsock, pSendBuf^, PACKET_SIZE, 0, DestAdr, sizeof(DestAdr) );

FD_ZERO( fd_read );
FD_SET( rawsock, fd_read );
timev.tv_sec := 5;
timev.tv_usec := 0;

if select( 0, @fd_read, nil, nil, @timev ) < 1 then
break;

if FD_ISSET( rawsock, fd_read ) then
begin
FillChar( pRecvBuf^, MAX_PACKET_SIZE, 0 );
FillChar( FromAdr, sizeof(FromAdr), 0 );
FromAdr.sin_family := AF_INET;
FromLen := sizeof( FromAdr );
recvfrom( rawsock, pRecvBuf^, MAX_PACKET_SIZE, 0, FromAdr, FromLen );

sReply := DecodeIcmpReply( pRecvBuf, ttl );
if sReply <> then
begin
ListBox1.ItemIndex := ListBox1.Items.Add( sReply );
Listbox1.Update;
end;
if ttl = 0 then //如果收到目标主机的相应包,DecodeIcmpReply会把ttl==0
break;
end;

Inc( ttl );
Sleep( 110 );
end; //while not bStop do

ListBox1.Items.Add( 追踪路由完成。 );
ListBox1.Items.Add( );

closesocket( rawsock );
closesocket(udpsock);
FreeMem( pSendBuf );
FreeMem( pRecvBuf );
end;

end.


------解决方案--------------------
如果压力较大
感觉标准的不如indy
indy不如api
------解决方案--------------------
upup...
------解决方案--------------------
用INDY好点,API有点复杂
------解决方案--------------------
ICS 用了都说好!
------解决方案--------------------
1000以下的连接用INDY不错,1000以上考虑自己封装完成端口。
------解决方案--------------------
所有VCL用FastMM检测都有哪个内存泄漏的提示,如果只有一个可以忽略,楼主看看源代码就知道了。
------解决方案--------------------
简单高效就是serversocket和clientsocket

③ WSAGetLastError()的返回值

6 - WSA_INVALID_HANDLE
指定的事件对象无效。若使用与Win32函数对应的Winsock函数,便有可能产生这样的Win32错误。它表明传递给WSAWaitForMultipleEvents的一个句柄是无效的。
8 - WSA_NOT_ENOUGH_MEMORY
内存不够。这个Win32错误指出内存数量不足,无法完成指定的操作。
87 - WSA_INVALID_PARAMETER
一个或多个参数无效。这个Win32错误表明传递到函数内部的参数无效。假若事件计数参数无效,那么在执行WSAWaitForMultipleEvents的时候,也会发生这样的错误。
258 - WSA_WAIT_TIMEOUT
操作超时。这个Win32错误指出重叠I/O操作未在规定的时间内完成。
995 - WSA_OPERATION_ABORTED
重叠操作被取消。这个Win32错误指出由于套接字的关闭,造成一次重叠I/O操作的取消。
除此以外,该错误也可能在执行SIO_FLUSH这个I/O控制命令时出现。
996 - WSA_IO_INCOMPLETE
重叠I/O事件对象未处于传信状态。这个Win32错误也和重叠I/O操作密切相关,在调用WSAGetOverlappedResults函数的时候产生,指出重叠I/O操作尚未完成。
997 - WSA_IO_PENDING
重叠操作将在以后完成。用Winsock函数发出一次重叠I/O操作时,若出现这样的Win32错误,便表明操作尚未完成,而且会在以后的某个时间完成。
10004 - WSAEINTR
函数调用中断。该错误表明由于对WSACancelBlockingCall的调用,造成了一次调用被强行中断。
10009 - WSAEBADF
文件句柄错误。该错误表明提供的文件句柄无效。在MicrosoftWindowsCE下,socket函数可能返回这个错误,表明共享串口处于“忙”状态。
10013 - WSAEACCES
权限被拒。尝试对套接字进行操作,但被禁止。若试图在sendto或WSASendTo中使用一个广播地址,但是尚未用setsockopt和SO_BROADCAST这两个选项设置广播权限,便会产生这类错误。
10014 - WSAEFAULT
地址无效。传给Winsock函数的指针地址无效。若指定的缓冲区太小,也会产生这个错误。
10022 - WSAEINVAL
参数无效。指定了一个无效参数。例如,假如为WSAIoctl调用指定了一个无效控制代码,便会产生这个错误。另外,它也可能表明套接字当前的状态有错,例如在一个没有监听的套接字上调用accept或WSAAccept的时候。
10024 - WSAEMFILE
打开文件过多。提示打开的套接字太多了。通常,Microsoft提供者只受到系统内可用资源数量的限制。
10035 - WSAEWOULDBLOCK
资源暂时不可用。对非阻塞套接字来说,如果请求操作不能立即执行的话,通常会返回这个错误。比如说,在一个非阻塞套接字上调用connect,就会返回这个错误。因为连接请求不能立即执行。
10036 - WSAEINPROGRESS
操作正在进行中。当前正在执行非锁定操作。一般来说不会出现这个错误,除非正在开发16位Winsock应用程序。
10037 - WSAEALREADY
操作已完成。一般来说,在非锁定套接字上尝试已处于进程中的操作时,会产生这个错误。比如,在一个已处于连接进程的非锁定套接字上,再一次调用connect或WSAConnect。
另外,服务提供者处于执行回调函数(针对支持回调例程的Winsock函数)的进程中时也会出现这个错误。
10038 - WSAENOTSOCK
无效套接字上的套接字操作。任何一个把SOCKET句柄当作参数的Winsock函数都会返回这个错误。它表明提供的套接字句柄无效。
10039 - WSAEDESTADDRREQ
需要目标地址。这个错误表明没有提供具体地址。比方说,假如在调用sendto时,将目标地址设为INADDR_ANY(任意地址),便会返回这个错误。
10040 - WSAEMSGSIZE
消息过长。这个错误的含义很多。如果在一个数据报套接字上发送一条消息,这条消息
对内部缓冲区而言太大的话,就会产生这个错误。再比如,由于网络自身的限制,使一条消息过长,也会产生这个错误。最后,如果收到数据报之后,缓冲区太小,不能接收消息时,也会产生这个错误。
10041 - WSAEPROTOTYPE
套接字协议类型有误。在socket或WSASocket调用中指定的协议不支持指定的套接字类型。
比如,要求建立SOCK_STREAM类型的一个IP套接字,同时指定协议为IPPROTO_UDP,便会产生这样的错误。
10042 - WSAENOPROTOOPT
协议选项错误。表明在getsockopt或setsockopt调用中,指定的套接字选项或级别不明、未获支持或者无效。
10043 - WSAEPROTONOSUPPORT
不支持的协议。系统中没有安装请求的协议或没有相应的实施方案。比如,如果系统中没有安装TCP/IP,而试着建立TCP或UDP套接字时,就会产生这个错误。
10044 - WSAESOCKTNOSUPPORT
不支持的套接字类型。对指定的地址家族来说,没有相应的具体套接字类型支持。比如,在向一个不支持原始套接字的协议请求建立一个SOCK_RAW套接字类型时,就会产生这个错误。
10045 - WSAEOPNOTSUPP
不支持的操作。表明针对指定的对象,试图采取的操作未获支持。通常,如果试着在一
个不支持调用Winsock函数的套接字上调用了Winsock时,就会产生这个错误。比如,在一个数据报套接字上调用accept或WSAAccept函数时,就会产生这样的错误。
10046 - WSAEPFNOSUPPORT
不支持的协议家族。请求的协议家族不存在,或系统内尚未安装。多数情况下,这个错误可与WSAEAFNOSUPPORT互换(两者等价);后者出现得更为频繁。
10047 - WSAEAFNOSUPPORT
地址家族不支持请求的操作。对套接字类型不支持的操作来说,在试着执行它时,就会出现这个错误。比如,在类型为SOCK_STREAM的一个套接字上调用sendto或WSASendTo函数时,就会产生这个错误。另外,在调用socket或WSASocket函数的时候,若同时请求了一个无效的地址家族、套接字类型及协议组合,也会产生这个错误。
10048 - WSAEADDRINUSE
下地址正在使用。正常情况下,每个套接字只允许使用一个套接字地址(例如,一个IP套接字地址由本地IP地址及端口号组成)。这个错误一般和bind、connect和WSAConnect这三个函数有关。可在setsockopt函数中设置套接字选项SO_REUSEADDR,允许多个套接字访问同一个本地IP地址及端口号。
10049 - WSAEADDRNOTAVAIL
不能分配请求的地址。API调用中指定的地址对那个函数来说无效时,就会产生这样的错误。例如,若在bind调用中指定一个IP地址,但却没有对应的本地IP接口,便会产生这样的错误。另外,通过connect、WSAConnect、sendto、WSASendTo和WSAJoinLeaf这四个函数为准备连接的远程计算机指定端口0时,也会产生这样的错误。
10050 - WSAENETDOWN
网络断开。试图采取一项操作时,却发现网络连接中断。这可能是由于网络堆栈的错误,网络接口的故障,或者本地网络的问题造成的。
10051 - WSAENETUNREACH
网络不可抵达。试图采取一项操作时,却发现目标网络不可抵达(不可访问)。这意味着本地主机不知道如何抵达一个远程主机。换言之,目前没有已知的路由可抵达那个目标主机。
10052 - WSAENETRESET
网络重设时断开了连接。由于“保持活动”操作检测到一个错误,造成网络连接的中断。
若在一个已经无效的连接之上,通过setsockopt函数设置SO_KEEPALIVE选项,也会出现这样的错误。
10053 - WSAECONNABORTED
软件造成连接取消。由于软件错误,造成一个已经建立的连接被取消。典型情况下,这意味着连接是由于协议或超时错误而被取消的。
10054 - WSAECONNRESET
连接被对方重设。一个已经建立的连接被远程主机强行关闭。若远程主机上的进程异常中止运行(由于内存冲突或硬件故障),或者针对套接字执行了一次强行关闭,便会产生这样的错误。针对强行关闭的情况,可用SO_LINGER套接字选项和setsockopt来配置一个套接字。
10055 - WSAENOBUFS
没有缓冲区空间。由于系统缺少足够的缓冲区空间,请求的操作不能执行。
10056 - WSAEISCONN
套接字已经连接。表明在一个已建立连接的套接字上,试图再建立一个连接。要注意的是,数据报和数据流套接字均有可能出现这样的错误。使用数据报套接字时,假如事先已通过connect或WSAConnect调用,为数据报通信关联了一个端点的地址,那么以后试图再次调用sendto或WSASendTo,便会产生这样的错误。
10057 - WSAENOTCONN
套接字尚未连接。若在一个尚未建立连接的“面向连接”套接字上发出数据收发请求,便会产生这样的错误。
10058 - WSAESHUTDOWN
套接字关闭后不能发送。表明已通过对shutdown的一次调用,部分关闭了套接字,但事后又请求进行数据的收发操作。要注意的是,这种错误只会在已经关闭的那个数据流动方向上才会发生。举个例子来说,完成数据发送后,若调用shutdown,那么以后任何数据发送调用都会产生这样的错误。
10060 - WSAETIMEDOUT
连接超时。若发出了一个连接请求,但经过规定的时间,远程计算机仍未作出正确的响应(或根本没有任何响应),便会发生这样的错误。要想收到这样的错误,通常需要先在套接字上设置好SO_SNDTIMEO和SO_RCVTIMEO选项,然后调用connect及WSAConnect函数。
要想了解在套接字上设置SO_SNDTIMEO和SO_RCVTIMEO选项的详情,可参考第9章。
10061 - WSAECONNREFUSED
连接被拒。由于被目标机器拒绝,连接无法建立。这通常是由于在远程机器上,没有任何应用程序可在那个地址之上,为连接提供服务。
10064 - WSAEHOSTDOWN
主机关闭。这个错误指出由于目标主机关闭,造成操作失败。然而,应用程序此时更有可能收到的是一条WSAETIMEDOUT(连接超时)错误,因为对方关机的情况通常是在试图建立一个连接的时候发生的。
10065 - WSAEHOSTUNREACH
没有到主机的路由。应用程序试图访问一个不可抵达的主机。该错误类似于WSAENETUNREACH。
10067 - WSAEPROCLIM
进程过多。有些Winsock服务提供者对能够同时访问它们的进程数量进行了限制。
10091 - WSASYSNOTREADY
网络子系统不可用。调用WSAStartup时,若提供者不能正常工作(由于提供服务的基层系统不可用),便会返回这种错误。
10092 - WSAVERNOTSUPPORTED
Winsock.dll版本有误。表明不支持请求的Winsock提供者版本。
10093 - WSANOTINITIALISED
Winsock尚未初始化。尚未成功完成对WSAStartup的一次调用。
10101 - WSAEDISCON
正在从容关闭。这个错误是由WSARecv和WSARecvFrom返回的,指出远程主机已初始化了一次从容关闭操作。该错误是在像ATM这样的“面向消息”协议上发生的。
10102 - WSAENOMORE
找不到更多的记录。这个错误自WSALookupServiceNext函数返回,指出已经没有留下更多的记录。这个错误通常可与WSA_E_NO_MORE互换使用。在应用程序中,应同时检查这个错误以及WSA_E_NO_MORE。
10103 - WSAECANCELLED
操作被取消。这个错误指出当WSALookupServiceNext调用仍在处理期间,发出了对WSALookupServiceEnd(服务中止)的一个调用。此时,WSALookupServiceNext便会返回这个错误。这个错误代码可与WSA_E_CANCELLED互换使用。作为应用程序,应同时检查这个错误以及WSA_E_CANCELLED
10105 - WSAEINVALIDPROVIDER
无效的服务提供者。这个错误同服务提供者关联在一起,在提供者不能建立正确的Winsock版本,从而无法正常工作的前提下产生。
10106 - WSAEPROVIDERFAILEDINIT
提供者初始化失败。这个错误同服务提供者关联在一起,通常见于提供者不能载入需要的DLL时。
10107 - WSASYSCALLFAILURE
系统调用失败。表明绝对不应失败的一个系统调用却令人遗憾地失败了。
10108 - WSASERVICE_NOT_FOUND
找不到这样的服务。这个错误通常与注册和名字解析函数相关,在查询服务时产生(第10章对这些函数进行了详尽解释)。该错误表明,在给定的名字空间内,找不到请求的服务。
10109 - WSATYPE_NOT_FOUND
找不到类的类型。该错误也与注册及名字解析函数关联在一起,在处理服务类(Service Class)时发生。若注册好一个服务的实例,它必须引用一个以前通过WSAInstallServiceClass安装好的服务。
10110 - WSA_E_NO_MORE
找不到更多的记录。这个错误是自WSALookupServiceNext调用返回的,指出已经没有剩
下的记录。该错误通常可与WSAENOMORE互换使用。作为一个应用程序,应同时检查这个
错误以及WSAENOMORE。
10111 - WSA_E_CANCELLED
操作被取消。该错误指出在对WSALookupServiceNext的调用尚未完成的时候,又发出了对WSALookupServiceEnd(中止服务)的一个调用。这样,WSALookupServiceNext就会返回该错误。这个错误代码可与WSAECANCELLED互换使用。作为一个应用程序,应同时检查这个错误以及WSAECANCELLED。
10112 - WSAEREFUSED
查询被拒。由于被主动拒绝,所以一个数据库查询操作失败。
11001 - WSAHOST_NOT_FOUND
主机没有找到。这个错误是在调用gethostbyname和gethostbyaddr时产生的,表明没有找到一个授权应答主机(AuthoritativeAnswerHost)。
11002 - WSATRY_AGAIN
非授权主机没有找到。这个错误也是在调用gethostbyname和gethostbyaddr时产生的,表明没有找到一个非授权主机,或者遇到了服务器故障。
11003 - WSANO_RECOVERY
遇到一个不可恢复的错误。这个错误也是在调用gethostbyname和gethostbyaddr时产生的,指出遇到一个不可恢复的错误,应再次尝试操作。
11004 - WSANO_DATA
没有找到请求类型的数据记录。这个错误也是在调用gethostbyname和gethostbyaddr时产生的,指出尽管提供的名字有效,但却没有找到与请求类型对应的数据记录。
11005 - WSA_QOS_RECEIVERS
至少有一条预约消息抵达。这个值同IP服务质量(QoS)有着密切的关系,其实并不是一个真正的“错误”(QoS的详情见第12章)。它指出网络上至少有一个进程希望接收QoS通信。
11006 - WSA_QOS_SENDERS
至少有一条路径消息抵达。这个值同QoS关联在一起,其实更像一种状态报告消息。它指出在网络上,至少有一个进程希望进行QoS数据的发送。
11007 - WSA_QOS_NO_SENDERS
没有QoS发送者。这个值同QoS关联在一起,指出不再有任何进程对QoS数据的发送有兴趣。请参阅第12章,了解在发生这样的错误时,对所发生情况的一系列完整说明。
11008 - WSA_QOS_NO_RECEIVERS
没有QoS接收者。这个值同QoS关联在一起,指出不再有任何进程对QoS数据的接收有兴趣。请参阅第12章,查阅对这个错误的完整说明。
11009 - WSA_QOS_REQUEST_CONFIRMED
预约请求已被确认。QoS应用可事先发出请求,希望在批准了自己对网络带宽的预约请求后,收到通知。若发出了这样的请求,一旦批准,便会收到这样的消息。请参阅第12章,了解对此消息的详细说明。
11010 - WSA_QOS_ADMISSION_FAILURE
缺乏资源致错。资源不够,以至于无法满足QoS带宽请求。
11011 - WSA_QOS_POLICY_FAILURE
证书无效。表明发出QoS预约请求的时候,要么用户并不具备正确的权限,要么提供的证书无效。
11012 - WSA_QOS_BAD_STYLE
未知或冲突的样式。QoS应用程序可针对一个指定的会话,建立不同的过滤器样式。若出现这一错误,表明指定的样式类型要么未知,要么存在冲突。请参阅第12章,了解对过滤器样式的详细说明。
11013 - WSA_QOS_BAD_OBJECT
无效的FILTERSPEC结构或者提供者特有对象。假如为QoS对象提供的FILTERSPEC结构无效,或者提供者特有的缓冲区无效,便会返回这样的错误,详见第12章。
11014 - WSA_QOS_TRAFFIC_CTRL_ERROR
FLOWSPEC有问题。假如通信控制组件发现指定的FLOWSPEC参数存在问题(作为QoS对象的一个成员传递),便会返回这样的错误。
11015 - WSA_QOS_GENERIC_ERROR
常规QoS错误。这是一个比较泛泛的错误;假如其他QoS错误都不适合,便返回这个错误。

④ 关于ePSXe模拟器设置问题~

EPSXE教程
准备
epsxe目前比较稳定的版本为1.52
下载epsxe 安装后桌面会生成图标 也可打开资源管理器 找到安装的目录 直接运行epsxe.exe

安装后文件如下
www.gamehlj.com/tupian/list.jpg" width=547>
让我们分别来看看几个常用的文件夹的作用。最左边的是 BIOS 文件夹,用于存放 BIOS 文件。ePSXe 所需的 1001 的 BIOS---Scph1001.bin 就要放到此文件夹下
存放记忆卡的文件夹 memcards ,epsxe000 是第一块记忆卡,epsxe001 是第二块
Plugins 文件夹,用来存放各种插件,如:图像,声音,手柄,光驱。。。。。凡是插件就解压缩到这个文件夹下吧
注意:由于插件都是*.dll的文件,平时是隐藏属性,你是看不到的,我为了让大家清楚才把属性改为了全部显示,如果你的文件夹下没有,改一下显示文件的属性看看吧

开始

双击那个手柄模样的可执行文件epsxe.exe

控制栏有5个菜单标签(File,Run,Config,Options,Cheat)
File
Run CDROM:运行Ps游戏碟
Run BIOS:运行Ps主机bios
Run ISO:运行Ps碟的iso镜像文件
Run PSX EXE:运行Ps碟EXE文件
Chage Disc: 换盘
Exit:退出
Run
Continue:继续运行之前被“Esc”中断的游戏
Reset:重新启动
Config (这部分最烦)
Video:图象部分,选择适合自己显卡的插件,并进行一系列的设置
Sound:声音部分,选择适合自己声卡的插件,并进行一系列的设置
Cdrom:选个适合自己光驱的插件,设定好光驱所在的盘符(我是f:)
Bios: 随便选一个吧,我试试都差不多的
MDEC: 用来控制播放游戏中的动画
Memory Card: 记录卡
Game Pad: 设置游戏手柄
Options
SIO irq always enable:永远打开SIO中断。(f4键)
Country: 选择播放的制式(Autodetect PAL NTSC)
Cheat
Edit Cheat Codes:编辑金手指代码
**help
帮助文件,没什么可说的

设置篇 第一次运行 配置向导会弹出

epsxe模拟器必须进行设置 分视频 声音等 每一项必须选择一个插件 比如说 视频中就有好多插件 如果您的显卡是geforce系列 就应该选择openGL的那个插件 你可以按着向导一步一步完成设置

下面我们不按着向导 详细讲解各项设置

视频部分 从菜单选取配置-视频 如图

如果您的显示卡是geforce系列 可以选Pete's OpenGL加速插件 1.56 具体情况可以看向导里面说明 选完插件后 单击配置按钮 (Pete's OpenGL加速插件已经升级到1.64) 如图

你可以用默认设置 如果您的机器好 可以选画面更靓 否则可以选速度更快 你可以把“启动时在屏幕上显示帧速率”打上勾 这样就可以在游戏中屏幕的左上角看到帧数 应该使帧数保持在55帧以上 最好是满帧60帧(或59帧)你可以选择不同的选项以达到更高的帧数

把“特定游戏修正”打上勾 单击画紫圈的按钮 如上图

把“修复铁拳3过关暂停的问题”打上勾

音频部分 如图

选择 ePSXe 内建驱动 1.5.0. 如图设置

光驱部分 如图

选择 ePSXe 内建光驱驱动 1.5.0.

单击配置 选择你的光驱

以下是bios 纪录卡 手柄的设置

你可以选择我们提供的记忆卡文件 请用第一个记忆卡选择 epsxe第二个记忆卡好像不能用

运行游戏

把铁拳3的ps游戏光盘放入光驱 选“Run CDROM”就行了
单击-文件-运行光盘 或 单击-文件-运行镜像 选定铁拳3的镜像文件 比如tk3.iso或tk3.bin 就可以了

两分钟架设Kaillera服务器
下载Kaillera 的服务器端程序,用写字板打开设置文件kaillerasrv.conf,然后按照里面的参数进行设置,我已绮把注释穇译成中文,超级简单,一看就明白。现在主要就是IP地址的设置,IP地址就是你现在这台电脑连上网后的IP地址,拨号用户的IP地址是动态的,每次都不同,所以每次上网开服务器都要重新设置,在局域网玩就不需要了。本机的IP地址可以在DOS窗口下打入 ipconfig,就可以查到本机现在的IP地址,然后在kaillerasrv.conf这个设置文件里面输入IP地址即可。

设置好之后运行kaillerasrv.exe,这时会出现一个DOS窗口,显示【Touching Kaillera master server...】,跟着就出现【Touching done!】,这时已绮架设好服务器,等人来PK你吧!!

你也可以通知其它好友来你的服务器上玩,你把服务器的【IP:端口】给对方,然后让他们在kaillera的客户端输入服务器的格式【IP:端口】例如: 211.159.33.150:27888,这样就可以连上你的服务器了。(IP:端口都是在kaillerasrv.conf里面设置的)

自己建服务器的好处就是 PING 永远都是0。如果对方的 PING 超过100就会有明显的跳贞,超过200只能玩玩 街霸方块这类不需要太快节奏的游戏,只要找到玩的窍门,在超过PING 200的情况下玩街霸方块 都可以疯狂PK那些低于PING 100那些人。大家多多练习!

注意:对战双方的ROM一定要相同,美版对美版,日版队日版。

现在大家可以开始设置,先用15秒查自己IP,然后用1分钟设置kaillerasrv.conf,保存设置后用15秒运行kaillerasrv.exe启动服务器,最后30秒就用QQ通知好友上来对战!!(转自emuchina)

昨天和一位仁兄试验了EPSXE1.4.0联网插件,下面把具体的准备工作和实战效果告诉大家,就当是抛砖引玉吧,希望有更多的人完善补充。
1)首先对战双方必须要有一样的实况足球版本。打了补丁的也一样。所以为了统一,我推荐大家使用完全实况里的ISS2(实况欧洲版)迷你版(22M)和实况足球2000世界俱乐部版迷你版。
2)双方必须要有一样的声音插件和设置。推荐使用No Sound 0.4。必且把里面所有的选项都关掉。因为开了声音对比赛意义不大但是严重影响速度。
3)下载CyberPad NET-Plugin-Version 1.0。并且在配置>网络游戏中选择它。公众网用户不必改动任何插件里的设置。开了防火墙和代理服务器的人要把防火墙和代理服务器的地址填在插件里 的"Firewall"设置中。
4)使用一样的BIOS。推荐统一使用SCPH-1001,因为大部分人都是用它,他也比较稳定,兼容性也好。
5)选择一样的制式。一般都是用PAL啦。
6)显卡插件不必一样,但是他对速度的影响最大。所以要根据自己的网络速度选择。昨天我是开到600*400窗口模式,FAST速度才勉强能玩,游戏速度大概26帧.所以要想玩到标准速度一定要装宽带网,否则就算联上了也玩不了。好在我已经申请了ADSL。
7)准备工作算是做完了,下面开始连接。约定一样的实况版本,选择ISO启动。接着会弹出一个network settings的窗口。player1是主机,player2是对手。主机把对应的IP贴到剪贴板上,然后用QQ发给对方,然后开始游戏,并等待对手连接上来。player2在自己对应的地方填上IP,然后连接上主机。双方必须注意的是,CyberPad Port这一栏一定不要改动!!!
8)下面就进入游戏了。只要有一个人按ESC暂停,双方都会停止。如果网速慢的话还会出现一方掉线,而对方还不知道。昨天有几次就是对方掉线了还不知道,结果轻松进球还以为对手很烂。判断对方是否掉线的2个办法就是开是否有暂停和对手是不是在乱跑,如果有,8成是掉了,所以最好不要随便暂停。
综合来说,这个新出的联网插件虽然响应广大爱好者的渴求,但是有太多问题,只能算是暂时缓解大家的急切心情,所以让我们等待下一个更加完善的版本出世吧。

⑤ c++如何控制网卡

C++怎样实现限制个人电脑上网

某些程序需要实现控制计算机上网的功能,譬如允许孩子周末晚上8点到10点左右可以上网,其他时间不能上网。经过研究,用户态下实现这个功能大致有以下几种方法(以下讨论基于windows各平台):
1、使用windows Hook,监视IE或其他浏览器的地址栏,发现有www或http字样的,则更改这些url,使之不能访问相应的url。这种方法实现可能相对容易,但是不准确,不能限制所有的上网软件。糊弄未成年小孩可能比较有效。
2、基于SPI的数据包过滤。通过编写自己的Winsock服务提供者(SPI),过滤掉不符合规则的包,如过滤访问Internet的数据包。下面会详述此方法。
3、使用Winsock 2的WSAIoctl特性进行包过滤。WinSock 2允许程序使用WSAIoctl() 给一个SOCK_RAW类型的socket设置SIO_RCVALL属性,这样Socket可以接收到所有经过本机的数据。此方法详细参阅文档“无需驱动程序的Sniffer-IPMon”
以上三种都是在用户态(user-mode)的实现方法。优点是方便实现,无须编程者理解驱动方面的知识,缺点是还是可能遗漏一些数据包,譬如那些一些病毒软件可能不通过socket接口来访问网络,这样用户态的程序就无法捕获到这些包。但由于我们的目的是限制普通用户上网,而不是做防火墙,所以第2种方法基本可以接受。至于第3种方法,据文档1描述经常无法看到本机发出去的数据包,我也没有仔细测试,有兴趣的朋友可以自己试试。
第2种方法主要参考了VC知识库《在线杂志》第20期中TOo2y的文章:“基于SPI的数据报过滤原理与实现”。Windows也有一个例子 Layered.zip。另外, 《windows网络编程技术》(Anthony Jones着 京京工作室译,机工出版),这本书第14章“Winsock2服务提供者接口”较详细讨论了SPI知识。
下面讨论实现方案。以一个局域网中的电脑为例,实现目标是:不能访问Internet,但可以访问局域网。我们知道,PC机上网有两种方式:A 通过网关(路由器)上网,B 通过代理服务器上网。
对于A,则其访问Internet时的地址都是公网地址,我们直接通过自己的传输服务提供者直接过滤掉。如下:
int WSPAPI WSPSendTo(
SOCKET s,
LPWSABUF lpbuffer,
DWORDdwbuffercount,
LPDWORDlpnumberofbytessent,
DWORDdwflags,
const struct sockaddr FAR *lpto,
intitolen,
LPWSAOVERLAPPEDlpoverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINElpcompletionroutine,
LPWSATHREADIDlpthreadid,
LPINTlperrno)
{

struct sockaddr_in sin;
sin=*(const struct sockaddr_in *)lpto;
//过滤掉访问地址不是本地局域网的包,下面只是简单认为192.168.*.*是局域网的IP,具体需
//根据不同的局域网网络地址进行设置。www.myhack58.com
if (192 != sin.sin_addr.S_un.S_un_b.s_b1)
{
OutputDebugString(_T("WSPSendTo Tencent Filtered"));
return 0;
}
else
{
return nextproctable.lpWSPSendTo(s,
lpbuffer,
dwbuffercount,
lpnumberofbytessent,
dwflags,
lpto,
itolen,
lpoverlapped,
lpcompletionroutine,
lpthreadid,
lperrno);
}
}

对于B,由于PC机是通过局域网中的代理上网的,所以其所有的上网数据包通过先发给本地代理,然后代理将它请求的网页返回给它,所以其访问Internet是间接的,其访问Internet时发出的包都是局域网的IP。这样上面的过滤规则就不适用。怎么办?我们可以先取得IE的代理服务器IP地址和端口号,然后将包的地址和端口号与IE的代理IP地址和端口号比较,如果都相等,则过滤此包。这样就可以限制PC机通过代理上网,同时不影响它访问代理服务器的局域网资源。

至于如何获取IE的代理服务器地址和端口号,可使用下面代码:
INTERNET_PROXY_INFO *pIEinfo = NULL;
DWORD dwSize = 0;
BOOL bRet = InternetQueryOption(NULL, INTERNET_OPTION_PROXY, pIEinfo, &dwSize);
pIEinfo = (INTERNET_PROXY_INFO*)new char[dwSize];
bRet = InternetQueryOption(NULL, INTERNET_OPTION_PROXY, pIEinfo, &dwSize);
结束语
这样,将两种上网途径都屏蔽掉,达到了限制PC机上网的目的。欢迎大家讨论。

⑥ SIO SYSTEM INITIATED

SYSTEM WARM UP 系统预热
---------------------------------
SIO SYSTEM INITIATED SIO系统初始化
---------------------------------

MODULE SELF CHECKS PASSED _ 通过模块自检

SYSTEM FULLY OPERATIONAL _ 系统完全启动

OPERATION GENERATOR MODULE ACTIVATED _ 生成器操作模块已激活

STAND BY FOR FIRST OPERATION ...... 准备初次操作

!!IRRELEVANT REPLY WILL BE DELETED WITHOUT NOTICE!!

不相关的回复将在无通知的情况下被删除!

翻译了一下,不知你的问题是什么???

仅供参考。

⑦ 求一个魔兽世界2.4单机版,70级的版本。给高分

1:网络一下大芒果单机版wow会有下载地址
2:花一个晚上下载。
3:安装完成后打开wow大芒果单机版的目录,里面有一个服务器启动。点开来。(每次都要打开要不然连接不了服务器)
4:目录里应该还有安装教学一类的文件,游戏的账号和密码可以找到
5:打开游戏输入账号密码。正在连接,连接成功!就可以玩了。
6:单机版有命令的代号:具体可以在网络搜到。有幽灵虎命令呢!

⑧ sio是什么电视机

海尔

SIO播出控制一体机是大连捷成自主研发的产品,它采用集成化的设计理念,将播出切换器、台标键控器、响度控制器、下变换、图卡发生、应急切换、流媒体编码器等多种功能合而为一。用一台设备取代传统的多个独立的播出设备,可实现高、标清同步播出和电视、网络同步播出。简化系统组成,便于实现系统快速部署,降低建设成本。SIO 播出控制一体机采用模块化设计,可以在其基础上通过扩展不同功能的模块以实现更加丰富的功能,比如多画面、拼接处理等。

⑨ 我这个电脑不能上网。显示有黄色感叹号

你好!这种情况是因为网络受限原因导致的。

  1. 先看看无线信号是否稳定,有时候弱的时候,就会出现受限的情况。

  2. 如果受限的话,优先查看ip地址是否获取正确。如果是win7的话,点击开始,然后输入cmd

  3. 接着在命令框中输入ipconfig,查看ip地址,win8的话,就是win+x。然后命令提示符。

  4. 一般这种情况的话,就尝试自动获取ip

  5. 获取好ip以后,重启路由器试试,重启路由器也无效的话,尝试更新网卡驱动,记得先卸载之前的驱动。

  6. 假如重装或者更新网卡还是受限的话,尝试无线的兼容性试试。

  7. 这三条指令的目的是优化tcp配置(这个名次我也不懂),否则就是优化无线配置就对了。

  8. 如果尝试了上面兼容性的方法,依旧无法上网的话。就只能尝试恢复系统。更换路由,最后就是服务站了。

热点内容
ftp保存密码是灰色 发布:2025-01-11 14:00:07 浏览:257
压缩文件最好 发布:2025-01-11 13:59:58 浏览:645
有几家java培训机构 发布:2025-01-11 13:55:05 浏览:472
搭建个人服务器缺点 发布:2025-01-11 13:54:13 浏览:372
怎么用安卓的手机登录ios第五人格 发布:2025-01-11 13:44:11 浏览:765
登陆Ftp重输密码 发布:2025-01-11 13:40:12 浏览:331
解压神器有氧射击 发布:2025-01-11 13:33:04 浏览:851
百度云的好友在哪个文件夹 发布:2025-01-11 13:32:13 浏览:746
2级c语言试题 发布:2025-01-11 13:09:21 浏览:939
rft屏幕代码编译 发布:2025-01-11 12:54:01 浏览:743