大概是这样:
客户端:在connect(用WSAConnect)的同时带上一些数据;
服务端:在accept(用WSAAccept)在接受连接的时候可以得
到一定数量的附带数据,
是怎么回事?哪里有详细资料??

解决方案 »

  1.   

    winsock倒是可以在msdn里找到一些资料,
    其实我想知道linux下有没有实现。
      

  2.   

    oob
    带外数据
    winsock有相应的描述。
      

  3.   

    MSDN 上有说明啊.我没有用过.
      

  4.   

    to zhaolaoxin() :
    oob不是在已建立的连接上传输数据吗?
    现在是讨论刚刚要建立连接的时候。
      

  5.   

    客户端用 WSAConnect
    服务器端 AcceptEx
      

  6.   

    http://www.csdn.net/develop/article/15/15226.shtm
      

  7.   

    to wxzfox(乐乐):
    有点不一样,最好是这样:客户端在connect同时能带上一些数据,但不是
    connect之后再send;而服务端不管客户端的accept的请求是否带了一些数
    据,但应该总是成功,而不是特意去等那个数据,只是在accept同时能检查
    是否有附带数据。看来,tcp/ip似乎没这样的实现,一个暂时的办法是:
    客户端:在connect,并且被服务端accept成功之后,再用send发送;
    服务端:accept之后,用那个可以检查是否有数据的函数(我忘了)来检查
    数据。但这个检查时间不能太短也不能太长。
      

  8.   

    WINSOCK提供了这一功能,但可惜的是,目前没有一个操作系统支持这一功能。
      

  9.   

    客户端:int  WSAConnect(
                            SOCKET s,                          
                            const struct sockaddr FAR *name,  
                            int namelen,                       
                            LPWSABUF lpCallerData,             
                            LPWSABUF lpCalleeData,             
                            LPQOS lpSQOS,                      
                            LPQOS lpGQOS                       
                           );服务器端: BOOL AcceptEx( 
                            SOCKET sListenSocket,      
                            SOCKET sAcceptSocket,      
                            PVOID lpOutputBuffer,      
                            DWORD dwReceiveDataLength,  
                            DWORD dwLocalAddressLength,  
                            DWORD dwRemoteAddressLength,  
                            LPDWORD lpdwBytesReceived,  
                            LPOVERLAPPED lpOverlapped  
                            );以下为摘录: 服务器要做的最普通的事情之一就是接受来自客户端的连接请求。在套接字上使用重叠I/O接受连接的惟一API就是AcceptEx()函数。有趣的是,通常的同步接受函数accept()的返回值是一个新的套接字,而AcceptEx()函数则需要另外一个套接字作为它的参数之一。这是因为AcceptEx()是一个重叠操作,所以你需要事先创建一个套接字(但不要绑定或连接它),并把这个套接字通过参数传给AcceptEx()。以下是一小段典型的使用AcceptEx()的伪代码:
    do {
        -等待上一个 AcceptEx 完成
        -创建一个新套接字并与完成端口进行关联
        -设置背景结构等等
        -发出一个 AcceptEx 请求
    }while(TRUE); 使用AcceptEx()的一大好处是,你可以通过一次调用就完成接受客户端连接请求和接受数据(通过传送lpOutputBuffer参数)两件事情。也就是说,如果客户端在发出连接的同时传输数据,你的AcceptEx()调用在连接创建并接收了客户端数据后就可以立刻返回。这样可能是很有用的,但是也可能会引发问题,因为AcceptEx()必须等全部客户端数据都收到了才返回。具体来说,如果你在发出AcceptEx()调用的同时传递了lpOutputBuffer参数,那么AcceptEx()不再是一项原子型的操作,而是分成了两步:接受客户连接,等待接收数据。当缺少一种机制来通知你的应用程序所发生的这种情况:“连接已经建立了,正在等待客户端数据”,这将意味着有可能出现客户端只发出连接请求,但是不发送数据。如果你的服务器收到太多这种类型的连接时,它将拒绝连接更多的合法客户端请求。这就是黑客进行“拒绝服务”攻击的常见手法。要预防此类攻击,接受连接的线程应该不时地通过调用getsockopt()函数(选项参数为SO_CONNECT_TIME)来检查AcceptEx()里守候的套接字。getsockopt()函数的选项值将被设置为套接字被连接的时间,或者设置为-1(代表套接字尚未建立连接)。这时,WSAEventSelect()的特性就可以很好地利用来做这种检查。如果发现连接已经建立,但是很久都没有收到数据的情况,那么就应该终止连接,方法就是关闭作为参数提供给AcceptEx()的那个套接字。注意,在多数非紧急情况下,如果套接字已经传递给AcceptEx()并开始守候,但还未建立连接,那么你的应用程序不应该关闭它们。这是因为即使关闭了这些套接字,出于提高系统性能的考虑,在连接进入之前,或者监听套接字自身被关闭之前,相应的内核模式的数据结构也不会被干净地清除。
    有关AcceptEx()的最后一个注意事项:要实现这些API,并不需要其它提供商提供的Winsock2实现。这一点对微软特有的其它API也同样适用,比如TransmitFile()和GetAcceptExSockAddrs(),以及其它可能会被加入到新版Windows的API. 在Windows NT和2000上,这些API是在微软的底层提供者DLL(mswsock.dll)中实现的,可通过与mswsock.lib编译连接进行调用,或者通过WSAIoctl() (选项参数为SIO_GET_EXTENSION_FUNCTION_POINTER)动态获得函数的指针。如果在没有事先获得函数指针的情况下直接调用函数(也就是说,编译时静态连接mswsock.lib,在程序中直接调用函数),那么性能将很受影响。因为AcceptEx()被置于Winsock2架构之外,每次调用时它都被迫通过WSAIoctl()取得函数指针。要避免这种性能损失,需要使用这些API的应用程序应该通过调用WSAIoctl()直接从底层的提供者那里取得函数的指针。