1、如何将select的option全部回传服务器
在提交之前执行一下for循环,先把ListBox2的所有项的selected设置为true,然后再执行submit事件,这样就可以把所有ListBox2的项都提交到服务器端了
2、服务器端,在WSAEventSelect模型下,怎么判断收到的FD
------解决方案--------------------
WSAWaitForMultipleEvents
------解决方案--------------------
TCP客户端用WSAWaitForMultipleEvents等待所有数据连接的FD_READ、FD_CLOSE
TCP服务器端用WSAWaitForMultipleEvents等待监听的FD_ACCEPT和数据连接的FD_READ、FD_CLOSE
不管是客户端还是服务器端,每建立一个SOCKET就WSACreateEvent一个EVENT并WSAEventSelect,在WSAWaitForMultipleEvents里面等这些EVENT,EVENT与SOCKET一一对应,更具WSAWaitForMultipleEvents的返回值来确定是哪个SOCKET
------解决方案--------------------
你要支持更多的客户端就用完成端口。。
------解决方案--------------------
WSAWaitForMultipleEvents对每64个Event分组进行查询的方式达到支持> 64客户端的支持
缺点就是效率比完成端口低
3、如何将select模型改为异步选择模型
异步选择(WSAAsyncSelect)模型是一个有用的异步 I/O 模型。利用这个模型,应用程序可在一个套接字上,
接收以 Windows 消息为基础的网络事件通知。具体的做法是在建好一个套接字后,调用WSAAsyncSelect函数。
该模型的核心即是WSAAsyncSelect函数。
█ 要想使用 WSAAsyncSelect 模型,在应用程序中,首先必须用CreateWindow函数创建一个窗口,再为该窗口提供一个窗口例程函数(WinProc)。
█ WSAAsyncSelect 的函数原型如下:
[cpp] view plain copy
int WSAAsyncSelect(
__in SOCKET s,
__in HWND hWnd,
__in unsigned int wMsg,
__in long lEvent
);
● s 参数指定的是我们感兴趣的那个套接字。
● hWnd 参数指定一个窗口句柄,它对应于网络事件发生之后,想要收到通知消息的那个窗口。
● wMsg 参数指定在发生网络事件时,打算接收的消息。该消息会投递到由hWnd窗口句柄指定的那个窗口。
(通常,应用程序需要将这个消息设为比Windows的WM_USER大的一个值,避免网络窗口消息与系统预定义的标准窗口消息发生混淆与冲突)
● lEvent 参数指定一个位掩码,对应于一系列网络事件的组合,大多数应用程序通常感兴趣的网络事件类型包括:
FD_READ、FD_WRITE、FD_ACCEPT、FD_CONNECT、FD_CLOSE。当然,到底使用FD_ACCEPT,还是使用FD_CONNECT类型,
要取决于应用程序的身份是客户端,还是服务器。如应用程序同时对多个网络事件有兴趣,只需对各种类型执行一次简单的按位OR(或)运算,
然后将它们分配给lEvent就可以了,例如:
WSAAsyncSeltct(s, hwnd, WM_SOCKET, FD_CONNECT | FD_READ | FD_WRITE | FD_CLOSE);
解释说明:我们的应用程序以后便可在套接字s上,接收到有关连接、发送、接收以及套接字关闭这一系列网络事件的通知。
█ 注意 ①:
多个事件务必在套接字上一次注册!
另外还要注意的是,一旦在某个套接字上允许了事件通知,那么以后除非明确调用closesocket命令,
或者由应用程序针对那个套接字调用了WSAAsyncSelect,从而更改了注册的网络事件类型,否则的话,
事件通知会永远有效!若将lEvent参数设为0,效果相当于停止在套接字上进行的所有网络事件通知。
█ 注意 ②:
若应用程序针对一个套接字调用了WSAAsyncSelect,那么套接字的模式会从“锁定”变成“非锁定”。
这样一来,如果调用了像WSARecv这样的Winsock函数,但当时却并没有数据可用,那么必然会造成调用的失败,并返回WSAEWOULDBLOCK错误。
为防止这一点,应用程序应依赖于由WSAAsyncSelect的uMsg参数指定的用户自定义窗口消息,来判断网络事件类型何时在套接字上发生;而不应盲目地进行调用。
FD_READ 应用程序想要接收有关是否可读的通知,以便读入数据
FD_WRITE 应用程序想要接收有关是否可写的通知,以便写入数据
FD_ACCEPT 应用程序想接收与进入连接有关的通知
FD_CONNECT 应用程序想接收与一次连接完成的通知
FD_CLOSE 应用程序想接收与套接字关闭的通知
█ 应用程序在一个套接字上成功调用了WSAAsyncSelect之后,会在与hWnd窗口句柄对应的窗口例程中,以Windows消息的形式,接收网络事件通知。
窗口例程通常定义如下:
[cpp] view plain copy
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
● hWnd 参数指定一个窗口的句柄,对窗口例程的调用正是由那个窗口发出的。
● uMsg 参数指定需要对哪些消息进行处理。这里我们感兴趣的是WSAAsyncSelect调用中定义的消息。
● wParam 参数指定在其上面发生了一个网络事件的套接字。假若同时为这个窗口例程分配了多个套接字,这个参数的重要性便显示出来了。
● lParam参数中,包含了两方面重要的信息。其中, lParam的低字(低位字)指定了已经发生的网络事件,而lParam的高字(高位字)包含了可能出现的任何错误代码。
█ 步骤:网络事件消息抵达一个窗口例程后,应用程序首先应检查lParam的高字位,以判断是否在网络错误。
这里有一个特殊的宏: WSAGETSELECTERROR,可用它返回高字位包含的错误信息。
若应用程序发现套接字上没有产生任何错误,接着便应调查到底是哪个网络事件类型,具体的做法便是读取lParam低字位的内容。
此时可使用另一个特殊的宏:WSAGETSELECTEVENT,用它返回lParam的低字部分。
█ 注意 ③:应用程序如何对 FD_WRITE 事件通知进行处理。
只有在三种条件下,才会发出 FD_WRITE 通知:
■ 使用 connect 或 WSAConnect,一个套接字首次建立了连接。
■ 使用 accept 或 WSAAccept,套接字被接受以后。
■ 若 send、WSASend、sendto 或 WSASendTo 操作失败,返回了 WSAEWOULDBLOCK 错误,而且缓冲区的空间变得可用。
因此,作为一个应用程序,自收到首条 FD_WRITE 消息开始,便应认为自己必然能在一个套接字上发出数据,
直至一个send、WSASend、sendto 或 WSASendTo 返回套接字错误 WSAEWOULDBLOCK。
经过了这样的失败以后,要再用另一条 FD_WRITE 通知应用程序再次发送数据。
用例:
[cpp] view plain copy
WSAAsyncSelect(pThis->m_SockListen, pThis->GetSafeHwnd(), WM_SOCKET, FD_ACCEPT | FD_CLOSE);//WM_SOCKET为自定义消息#define WM_SOCKET WM_USER+100
[cpp] view plain copy
//override窗口过程函数
LRESULT CServerDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_SYSCOMMAND:
if (wParam == SC_CLOSE) {
closesocket(m_SockClient);
closesocket(m_SockListen);
WSACleanup();
}
break;
case WM_SOCKET:
if (WSAGETSELECTERROR(lParam)) {
--m_ClientNums;
closesocket(wParam);
break;
}
switch(WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
{
if (m_ClientNums >= 1) {
break;
}
m_SockClient = accept(wParam, NULL, NULL);
WSAAsyncSelect(m_SockClient, m_hWnd, WM_SOCKET, FD_READ|FD_WRITE|FD_CLOSE);
++m_ClientNums;
break;
}
case FD_READ:
{
TCHAR szBuf[MAX_BUF_SIZE] = {0};
recv(wParam, (char *)szBuf, MAX_BUF_SIZE, 0);
ShowMsg(szBuf);
break;
}
case FD_WRITE:
wParam = wParam;
break;
case FD_CLOSE:
--m_ClientNums;
closesocket(wParam);
break;
}
default:break;
}
return CDialog::WindowProc(message, wParam, lParam);
}
4、如何实现“select * from "服务器名".数据库名.表名”
楼主,不是吧,你怎么会想到这样一个设计方案啊?不只是在SQL中,我想在任何一个数据库都不可能会有这样的功能,你难道是要用数据库连接数据库?这是没有意思的事情.即使有这种需要也不是这样实现的,一般都是通过其它的程序中的功能来实现的.
5、sql server 中如何select不同服务器的数据库
如已经建立连接服务器,直接select * from 服务器ip.数据库.dbo.表 就可以访问
否则可以采用:
SELECT *
FROM OPENDATASOURCE(
'SQLOLEDB',
'Data Source=ServerName;User ID=MyUID;Password=MyPass'
).pubs.dbo.表, OPENDATASOURCE(
'SQLOLEDB',
'Data Source=另一台pcServerName;UserID=另UID;Password=另Pass'
).pubs.dbo.表
----
如有不明白F1查OPENDATASOURCE
6、windows select模型 和linux的区别
1、免费与收费 在中国,windows和linux都是免费的,至少对个人用户是如此,如果那天国内windows真的严打盗版了,那linux的春天就到了!但现在linux依然是任重道远,前路漫漫。 2、软件与支持 windows下可以运行绝大部分软件、玩99.999%的游戏、...
7、ace acceptor用的是select模型吗
|我们先看一个服务小例子,并比较Reactor框架
#include <iostream>
#include "ace/auto_ptr.h"
#include "ace/log_msg.h"
#include "ace/inet_addr.h"
#include "ace/sock_acceptor.h"
#include "ace/reactor.h"
#include "ace/acceptor.h"
#include "ace/Connector.h"
#include "ace/Reactor_Notification_Strategy.h"
#include "ace/Select_Reactor.h"
#include "ace/Singleton.h"
#include "ace/svc_handler.h"
#include "ace/Message_Block.h"
#include "ace/Message_Queue.h"
#include "ace/SOCK_Stream.h"
#include "ace/Null_Mutex.h"
#include "ace/Null_Condition.h"
using namespace std;
//服务客户
class ClientService:public ACE_Svc_Handler<ACE_SOCK_STREAM,ACE_NULL_SYNCH>
{
public:
int open(void *p);
virtual int handle_input(ACE_HANDLE fd=ACE_INVALID_HANDLE);
virtual int handle_output(ACE_HANDLE fd=ACE_INVALID_HANDLE);
virtual int handle_close(ACE_HANDLE handle,ACE_Reactor_Mask close_mask);
protected:
ACE_SOCK_Stream sock_;
ACE_Message_Queue<ACE_NULL_SYNCH> output_queue_;
};
int ClientService::open(void *p)
{
if(ACE_Svc_Handler::open(p)==-1)
return -1;
ACE_TCHAR peer_name[512];
ACE_INET_Addr peer_addr;
if(this->peer().get_remote_addr(peer_addr)==0&&peer_addr.addr_to_string(peer_name,512)==0)
cout<<" connection from "<<peer_name<<endl;
return 0;
}
int ClientService::handle_input(ACE_HANDLE)
{
const size_t INPUT_SIZE=4096;
char buffer[INPUT_SIZE];
ssize_t recv_cnt,send_cnt;
if((recv_cnt=this->peer().recv(buffer,sizeof(buffer)))<=0)
{
ACE_DEBUG((LM_DEBUG,ACE_TEXT("(%P|%t) connection closed/n")));
return -1;
}
send_cnt=this->peer().send(buffer,ACE_static_cast(size_t,recv_cnt));
if(send_cnt==recv_cnt)
return 0;
if(send_cnt==-1&&ACE_OS::last_error()!=EWOULDBLOCK)
ACE_ERROR_RETURN((LM_ERROR,ACE_TEXT("%P|%t) %p/n"),ACE_TEXT("send")),0);
if(send_cnt==-1)
send_cnt=0;
ACE_Message_Block *mb;
size_t remaining=ACE_static_cast(size_t,(recv_cnt-send_cnt));
ACE_NEW_RETURN(mb,ACE_Message_Block(&buffer[send_cnt],remaining),-1);
int output_off=this->msg_queue()->is_empty();
ACE_Time_Value nowait(ACE_OS::gettimeofday());
if(this->putq(mb,&nowait)==-1)
{
ACE_ERROR((LM_ERROR,ACE_TEXT("(%P|%t)%P;d
不同Reactor框架,此框架无需写ClientAcceptor类,即无需设置acceptor对象的ACE_Reactor实例,只需typedef
typedef ACE_Acceptor<ClientService,ACE_SOCK_ACCEPTOR> ClientAcceptor;
我们继续考察ClientService类
class ClientService:public ACE_Svc_Handler<ACE_SOCK_STREAM,ACE_NULL_SYNCH>
ACE_Svc_Handler允许你指定流类型和加锁类型,与ACE_Acceptor一样,ACE_Svc_Handler需要使用流的地址trait,所以我们使用了ACE_SOCK_STREAM宏,使这些代码在支持或不支持模板trait类型的系统上都能编译
之所以要加锁类型,是因为ACE_Svc_Handler是派生自ACE_Task的,后者含有一个ACE_Message_Queue成员,你必须为这个成员提供同步类型。
在此我们不会使用ACE_Task提供的线程能力,但我们要使用继承而得的ACE_Message_Queue成员,所以我们移除了先前例子的ACE_Message_Queue成员。
另外,我们只使用一个线程,所以用ACE_NULL_SYNCH
注意:ACE_Svc_Handler按照我们通常所需的方式实现了get()_handle()方法,所以此方法也不见了
接着,再看handle_input(ACE_HANDLE)方法,与前一个版本不同的是:
1.我们使用ACE_Svc_Handler::peer()方法是访问底层的ACE_SOCK_Stream
2.我们通过继承的ACE_Task::msg_queue()方法访问继承的ACE_Message_Queue
3.为了把数据块放入队列中,我们可以继承而得的ACE_Task::putq()方法。同样,我们新的handle_output也类似的,但他利用了继承而得的方法
最后,默认的handle_close()方法会移除所有的反应器登记信息,取消所有的定时器,并删除该处理器
ACE_Svc_Handler的使用极大地简化了我们的服务处理器,使得我们能完全专注于需要的解决的问题,而不需要为所有那些连接管理问题而分心
接着,我们再看ACE_Connector
#include <iostream>
#include "ace/reactor.h"
#include "ace/inet_addr.h"
#include "ace/sock_stream.h"
#include "ace/sock_connector.h"
#include "ace/connector.h"
#include "ace/svc_handler.h"
#include "ace/reactor_notification_strategy.h"
#include <conio.h>
using namespace std;
typedef ACE_Svc_Handler<ACE_SOCK_STREAM,ACE_NULL_SYNCH> super;
class Client:public ACE_Svc_Handler<ACE_SOCK_STREAM,ACE_NULL_SYNCH>
{
public:
Client():notifier_(0,this,ACE_Event_Handler::WRITE_MASK)
{
}
virtual int open(void *p=0);
virtual int handle_input(ACE_HANDLE fd=ACE_INVALID_HANDLE);
virtual int handle_output(ACE_HANDLE fd=ACE_INVALID_HANDLE);
virtual int handle_timeout(const ACE_Time_Value ¤t_time,const void *act=0);
private:
enum{ITERATIONS=5};
int iterations_;
ACE_Reactor_Notification_Strategy notifier_;
};
int Client::open(void *p)
{
ACE_Time_Value iter_delay(2);
if(ACE_Svc_Handler::open(p)==-1)
return -1;
this->notifier_.reactor(this->reactor());
this->msg_queue()->notification_strategy(this->notifier_);
return this->reactor()->schele_timer(this,0,ACE_Time_Value::zero,iter_delay);
}
int Client::handle_input(ACE_HANDLE)
{
char buf[64];
ssize_t recv_cnt=this->peer().recv(buf,sizeof(buf)-1);
if(recv_cnt>0)
{
}
if(recv_cnt==0||ACE_OS::last_error()!=EWOULDBLOCK)
从程序中我们看到有一个新类,ACE_Reactor_Notification_Strategy是一个策略类,实现了Strategy模式,它允许你定制另一个类的行为,且无需改变受影响的类
在例子中也可以看到构造的时候先初始化了notifier_对象,设置正确的ACE_Reactor指针,目的是通过ACE_Reactor_Notification_Strategy这样的对象使ACE_Message_Queue策略化。如果ACE_Message_Queue拥有一个策略对象,无论何时有ACE_Message_Block对象进入队列,ACE_Message_Queue都会调用该策略对象的notify()方法。因为我们已经设置了notifier_,他会在Client的反应器上发出notify()调用,把一个通知放入队列,通知的目标是我们的client对象的handle_output()方法。要把ACE_Message_Queue的入队操作结合进反应器的事件循环
handle_timeout方法:如果我们把预定数目的串发给服务器,就是用close_writer()方法关闭我们这一端的TCP/IP socket。
注意,对于我们想要发往服务器的每一个串,我们都把它插入一个ACE_Message_Block,并把这个块放入队列,这将使消息队列用notifier_对象把通知放入反应器的队列。当反应器处理该通知时,他会调用我们的handle_output方法,然后我们从队列中取出数据,直到队列变空。
在handle_output方法中,有cancel_wakeup()和schele_wakeup(),前者是从这个处理器的反应器登记信息中移除指定的掩码位,而schele_wakeup()则增加指定的掩码。也就是说不会造成handle_close()被调用。因此,这一次也无需实现handle_close(),以专门处理被取消的WRITE掩码,我们复用了ACE_Svc_Handler的默认handle_close()方法,所以无需编写代码
8、select 模型中服务器端 可写代码为什么放到可读里
异步选择(WSAAsyncSelect)模型是一个有用的异步 I/O 模型。利用这个模型,应用程序可在一个套接字上,
接收以 Windows 消息为基础的网络事件通知。具体的做法是在建好一个套接字后,调用WSAAsyncSelect函数。
该模型的核心即是WSAAsyncSelect函数。
█ 要想使用 WSAAsyncSelect 模型,在应用程序中,首先必须用CreateWindow函数创建一个窗口,再为该窗口提供一个窗口例程函数(WinProc)。
9、select函数怎么提高了服务器的性能
方法如下。 1.创建一个监听TCP套接字并捆绑服务器的众所周知的端口,设置SO_REUSEADDR套接字选项以防止该端口上已有连接存在。 2.还创建一个UDP套接字并捆绑与TCP套接字相同的端口。这里无需在调用bind之前设置SO_REUSEADDR套接字选项,