对于socket的一些问题。关于accept函数(SOCKET s,……),本函数从s额等待队列中抽取一个连接,创建一个与s同类的的新的套接口并返回句柄,如果队列中无等待连接,且讨接口为非阻塞方式,即accept()阻塞调用进程直至新的连接出现。如果套接口为非阻塞方式且队列中等待连接,则accept()返回一错误码,已接受连接的套接口不能用于接受新的连接,原始讨接口保持开放。
问题:对于accept函数是否将其设置为非阻塞和阻塞都一样的,对于上面说的“如果套接口为非阻塞方式且队列中等待连接,则accept()返回一错误码,已接受连接的套接口不能用于接受新的连接,原始讨接口保持开放。”,那么是否是因为已经接受连接的套接口没有释放连接的原因,这种情况应该如果解决(不采用创建线程的方法)。如果讨接口为阻塞方式,那么当有一个套接口连接后,那么其它在队列中的等待接受的套接字会在什么时候被接受?
比如如下代码
{
SOCKET S,S1;
……
while(1)
{
s1=accept(s,……);
recv(s1,……);
send(s1,……)
}
closesocket(s1);
closesocket(s);
}
上面的情况是否无论如何只能接受一个套接字啊,如果将closesocket(s1)放在while循环之后,那么该代码可以接受多个套接字并且接受和发送数据,但是如果客户端没有发送数据,而此时有新的socket要进行连接那么此时是否会出现一个错误啊?
如果一个服务器和多个客户端进行聊天程序即当一个客户端和服务器建立一条连接之后就进入聊天模式,服务器端并不知道要处理多少个客户的情况下,怎么处理客户端来连接的套接字,总不会用套接字数组吧,还有如何让服务器端选择多个连接的客户端的一个来进行聊天啊?

解决方案 »

  1.   

    如果一个服务器和多个客户端进行聊天程序即当一个客户端和服务器建立一条连接之后就进入聊天模式,服务器端并不知道要处理多少个客户的情况下,怎么处理客户端来连接的套接字,总不会用套接字数组吧,还有如何让服务器端选择多个连接的客户端的一个来进行聊天啊?答复:(1)可以采用链表,把连好的套接字放到链表中,至于如何让服务器端选择多个连接的客户端的一个来进行聊天啊,你可以对套接字加一个id,然后根据这个id来区分每个套接字;(2)
    while(1)
    {
    //新建套接字给s1
    s1=accept(s,……);
    recv(s1,……);
    send(s1,……)
    }
    就可以接受多个套接字;(3)如果讨接口为阻塞方式,那么当有一个套接口连接后,那么其它在队列中的等待接受的套接字会在什么时候被接受?
    答复:会自动接受
      

  2.   

    对于(2)应该是这样对吗?socket *s1=new socket;不然是不可以接受多个套接字的是吧?还有一个前提是不是recv应该有数据接手是吧,不然它一直会阻塞下去,而导致没有机会循环做上面的accept函数对吧??
    对于3点,下面这样的代码也可以吗?
    socket s1;
    while(1)
    {
    s1=accept(s,……);
    recv(s1,……);
    send(s1,……)
    }
    如果是这样可以,那么它会覆盖已经接受的那个连接吗,还是提示会出错??
    我觉得下面的是可以的,对吗?
    while(1)
    {
    socket *s1=new socket
    s1=accept(s,……);
    recv(s1,……);
    send(s1,……)
    }