socket的select模型。设置阻塞套接字和非阻塞套接字有意义吗 [问题点数:20分]

Bbs1
本版专家分:0
结帖率 66.67%
Bbs7
本版专家分:14728
Bbs12
本版专家分:361543
版主
Blank
名人 2013年 荣获名人称号
Blank
探花 2011年 总版技术专家分年内排行榜第三
2010年 总版技术专家分年内排行榜第三
Blank
进士 2012年 总版技术专家分年内排行榜第五
Blank
金牌 2012年1月 总版技术专家分月排行榜第一
Bbs6
本版专家分:6904
套接字阻塞和非阻塞send/recv
先理一下<em>阻塞</em>和非<em>阻塞</em>的概念: <em>阻塞</em>就是让当前调用线程一直处于停止等待当中,挂起的状态,线程函数会被卡住。 非<em>阻塞</em>则是不管运行结果如何,都会继续往下执行(往往都要处理很多返回结果),线程函数里一般都是一个循环,不停的轮询。 再理一下发送接收函数: send/sendto函数,只是把应用层的数据拷贝到内核发送缓冲区,并不保证数据一定会被发送到对端,真正执行发送及什么时候发送是由系统(协
Linux下非阻塞套接字设置
我的要求是,该<em>socket</em>正常<em>阻塞</em>,等待一段时间之后,如果没有数据到达就自动返回rn我记得是可以<em>设置</em>来着
重叠套接字阻塞套接字
请问一下,我使用hLisnSock=WSASocket(PF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED)生成的<em>套接字</em>已经是重叠<em>套接字</em>了,可以实现异步传输,为什么书中在另一个例程里面在生成重叠<em>套接字</em>之后还要用hLisnSock=ioctl<em>socket</em>(hLisnSock,FIONBIO,&mode)。重叠<em>套接字</em>已经可以异步传输了(非<em>阻塞</em>模式),为什么还要再用这个函数<em>设置</em>一遍非<em>阻塞</em>模式??
C++设置套接字为非阻塞套接字实战
一点睛 把<em>套接字</em>设为非<em>阻塞</em>模式后,很多Linsock函数会立即返回,但并不意味着操作已经结束。 二<em>设置</em><em>套接字</em>为非<em>阻塞</em><em>套接字</em> 1代码 #include &lt;sys/<em>socket</em>.h&gt; #include &lt;arpa/inet.h&gt; #include &lt;assert.h&gt; #include &lt;stdio.h&gt; #include &lt;uni...
阻塞套接字
普通<em>套接字</em>的缺陷 普通<em>套接字</em>一次只能服务一个客户端,而且若无客户端连接,accept()一直<em>阻塞</em>,无数据传输,recv一直<em>阻塞</em>,传输效率极低。 普通服务器的IO模型 操作系统监听用户进程的状态,若无数据,则一直等待,知道用户请求数据,操作系统才进行数据处理。 普通<em>套接字</em>实现的服务端的瓶颈 在没有新的<em>套接字</em>来之前, 不能处理已经建立连接的<em>套接字</em>的请求(多个客户端连接只有一个被服务)...
异步IO下,套接字阻塞与否并没有意义
是这样的吗?rn我的理解是这样的,但没时间好好试一下,这里问一下高手。rnrn我说的异步IO,是指windows下的重叠IO和IOCP,以及linux下的异步IO(包括glibc实现的aio,比如aio_read和kernel实现的aio,比如io_setup io_submit等),这些异步IO模型的文档中几乎都没有提到过<em>套接字</em>的<em>阻塞</em>与否,我感觉异步IO不应该与<em>套接字</em>的<em>阻塞</em>与否有关,即不管<em>套接字</em>是<em>阻塞</em>的还是非<em>阻塞</em>的,在异步IO模型之下,表现是相同的,你们觉得呢?rnrn我在windows下用重叠IO和IOCP的时候,从来都用的是<em>阻塞</em>式<em>套接字</em>,不知道用非<em>阻塞</em>的会怎样,有同仁用过吗?还有linux下的(注意epoll肯定不是异步IO,所以在使用过程中,得考虑<em>套接字</em>的<em>阻塞</em>与否,这在手册里面有说的)aio。
关于使用阻塞套接字还是非阻塞套接字的问题?
我的应用背景是去远程操作数据库,所以需要将客户端与服务器端进行<em>套接字</em>连接。客户端通过往服务器端发送一些命令和数据(比方说,登陆命令,注册,更新数据库等等)。服务器端接受到后去相应的操作数据库。现在的问题是,我应该在两端使用什么样的<em>套接字</em>进行连接?rn这种情况下,如果我选择使用<em>阻塞</em><em>套接字</em>,并将这些操作都放入一个单独线程中进行,这样的话效率比起非<em>阻塞</em>的要差多少?rn而使用非<em>阻塞</em><em>套接字</em>,但非<em>阻塞</em><em>套接字</em>总是不能马上响应连接等操作。所以我觉得因为我的要求是每个客户端与都可以服务端进行准确的对话,所以就想请教大家我应该使用什么样的通信更好更准确一些。rnrn
阻塞套接字和非阻塞套接字的奇怪问题,大侠进。
connect之后调用recv,rn在<em>阻塞</em>下recv到的数据是正常的,rn而非<em>阻塞</em>下recv返回始终是-1 errno == EAGAIN, 即使用while 1 recv,返回值始终是 -1 errno == EAGAINrnrn代码如下rn<em>阻塞</em>的connect代码就不贴了,rn非<em>阻塞</em>的connect如下rnrn[code=c]static int _connect(struct sockaddr_in *sockad, int *sockid)rnrn int sock;rn int reuse = 1;rn int iRet;rnrn fd_set rdevents,wrevents,exevents;rn struct timeval tv;rn// struct timeval nTimeout;rn socklen_t sLen;rn int iSocket = 0;rnrn sock = <em>socket</em>(AF_INET, SOCK_STREAM, IPPROTO_TCP);rn if(sock < 0)rn rn return -1;rn rnrn if(setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(int)) < 0)rn rn close(sock);rn return -1;rn rnrn //<em>设置</em>为非<em>阻塞</em>模式rn unsigned long ul = 1;rn ioctl(sock, FIONBIO, &ul);rnrn //与服务器端建立连接rn if(((iRet = connect(sock, (struct sockaddr *)sockad, sizeof(struct sockaddr_in))) < 0) && errno != EINPROGRESS)rn rn //失败rn close(sock);rn iRet = -1;rn goto leave;rn rnrnrn //若没有直接连接成功则需要等待rn if(0 != iRet)rn rn //把先前的<em>套接字</em>加到读集合里面 rn FD_ZERO(&rdevents);rn FD_SET(sock, &rdevents); rn wrevents = rdevents; rn //异常集合rn exevents = rdevents; rn //<em>设置</em>时间为5秒rn tv.tv_sec = 5; rn tv.tv_usec = 0;rnrn iRet = select(sock + 1, &rdevents, &wrevents, &exevents, &tv);rn if (iRet < 0) rn rn //错误处理rn close(sock); rn sock = INVALID_SOCKET;rn iRet = td_failure;rn goto leave;rn rn else if(0 == iRet) rn rn //超时处理rn close(sock); rn sock = INVALID_SOCKET;rn iRet = td_failure;rn goto leave;rn rn else rn rn if(2 == iRet) rn rn int error;rn int len = sizeof(error); rn getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, (socklen_t*)&len); rn if (error) rn rn //超时处理rn close(sock); rn sock = INVALID_SOCKET;rn iRet = td_failure;rn goto leave;rn rn rn rn if(!FD_ISSET(sock, &rdevents) && !FD_ISSET(sock, &wrevents)) rn rn close(sock);rn sock = INVALID_SOCKET;rn iRet = td_failure;rn goto leave;rn rn rn if(getsockopt(sock, SOL_SOCKET, SO_ERROR, &iRet, &sLen));rn rn rn if(2 == iRet)rn rn close(sock); rn sock = INVALID_SOCKET;rn iRet = td_failure;rn goto leave;rn rn rn rnleave:rn *sockid = sock;rn return iRet;rn[/code]
哪位大侠说一下阻塞套接字和非阻塞套接字的概念?
谢谢!
select模型判断套接字状态
程序维护了一动态的<em>套接字</em>树组,其中可能有一些在某些时间不可用.我想用<em>select模型</em>判断哪些不可用并把它从数组中删除.rn请问该怎么做啊??rn是不是可以将所有的<em>套接字</em>放到exceptFds集合中呢???
阻塞的tcp套接字,可以设置事件吗?
<em>阻塞</em>的tcp<em>套接字</em>,可以<em>设置</em>事件吗,rn
socket select模型 判断接套接字可读问题
小弟在编写一个网络通信程序中要用到<em>select模型</em>,但在测试时,发现<em>select模型</em>在判断<em>套接字</em>可读的时候有问题。 客户端的一次数据发送,服务器端被认为是多次数据发送,因此就造成如下问题无法形成一次完整的数据接收,请问这是<em>select模型</em>本身就存在的问题还是自己对<em>select模型</em>理解不彻底?代码如下:rnserver:rn[code=C/C++][/code]rnint main()rnrn USHORT nPort = 4567; // 此服务器监听的端口号rnrn // 创建监听套节字rn SOCKET sListen = ::<em>socket</em>(AF_INET, SOCK_STREAM, IPPROTO_TCP);rn sockaddr_in sin;rn sin.sin_family = AF_INET;rn sin.sin_port = htons(nPort);rn sin.sin_addr.S_un.S_addr = INADDR_ANY;rn // 绑定套节字到本地机器rn if(::bind(sListen, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)rn rn printf(" Failed bind() \n");rn return -1;rn rn // 进入监听模式rn ::listen(sListen, 5);rnrn // <em>select模型</em>处理过程rn // 1)初始化一个套节字集合fdSocket,添加监听套节字句柄到这个集合rn fd_set fdSocket; // 所有可用套节字集合rn FD_ZERO(&fdSocket);rn FD_SET(sListen, &fdSocket);rn while(TRUE)rn rn // 2)将fdSocket集合的一个拷贝fdRead传递给select函数,rn // 当有事件发生时,select函数移除fdRead集合中没有未决I/O操作的套节字句柄,然后返回。rn fd_set fdRead = fdSocket;rn int nRet = ::select(0, &fdRead, NULL, NULL, NULL);rn if(nRet > 0)rn rn // 3)通过将原来fdSocket集合与select处理过的fdRead集合比较,rn // 确定都有哪些套节字有未决I/O,并进一步处理这些I/O。rn for(int i=0; i< FD_SETSIZE)rn rn sockaddr_in addrRemote;rn int nAddrLen = sizeof(addrRemote);rn SOCKET sNew = ::accept(sListen, (SOCKADDR*)&addrRemote, &nAddrLen);rn FD_SET(sNew, &fdSocket);rn printf("接收到连接(%s)\n", ::inet_ntoa(addrRemote.sin_addr));rn rn elsern rn printf(" Too much connections! \n");rn continue;rn rn rn elsern rnrn char szText[256];rn int nRecv = ::recv(fdSocket.fd_array[i], szText, strlen(szText), 0);rn if(nRecv > 0) // (2)可读rn rn szText[nRecv] = '\0';rn printf("接收到数据:%s \n", szText);rn rn else // (3)连接关闭、重启或者中断rn rn ::close<em>socket</em>(fdSocket.fd_array[i]);rn FD_CLR(fdSocket.fd_array[i], &fdSocket);rn rn rn rn rn rn elsern rn printf(" Failed select() \n");rn break;rn rn rn return 0;rnrnrnclient: <em>阻塞</em>模式 send函数rn
socket()创建的套接字默认是阻塞的还是非阻塞的?
书上说创建时是<em>阻塞</em>的,但调用listen或connect都立即返回了,rn为什么?
socket 套接字 Java 套接字 编程
<em>socket</em> <em>套接字</em> Java <em>套接字</em> 编程 <em>socket</em> <em>套接字</em> Java <em>套接字</em> 编程 <em>socket</em> <em>套接字</em> Java <em>套接字</em> 编程 <em>socket</em> <em>套接字</em> Java <em>套接字</em> 编程
阻塞套接字和重叠IO套接字有什么区别?
有点晕了,大家解答下 谢谢
阻塞套接字的接收
我用ioctl<em>socket</em>把<em>套接字</em><em>设置</em>成了非<em>阻塞</em>式的 但怎样接收数据呢。我知道要用select ,但不知道怎样用,用在什么地方。请把代码写在下面或发到我的邮箱 谢谢。我的邮箱地址是fengge2724@sina.com rn
socket套接字
介绍soket编程的一个例子,对初学者很有用
Socket 套接字
client客户端 new Thread(new Runnable() { @Override public void run() { try { //初始化接口对象 ...
SOCKET:套接字
SOCKET (domain协议域AF_INET,type类型SOCK_STREAM,protocol协议IPPROTO_TCP)    说明:<em>套接字</em>,编程接口API,返回【描述符】,失败则-1;描述符在进程空间的【描述符表】,数据结构在内核 缓冲里。根据指定的地址族、数据类型和协议来分配一个<em>socket</em>的描述字及其所用的资源。     原理:C发送连接请求→等待连接中的S→接受确认并
套接字(Socket)
Socket通常也称作&quot;<em>套接字</em>&quot;,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过&quot;<em>套接字</em>&quot;向网络发出请求或者应答网络请求。 <em>套接字</em>用(IP地址:端口号)表示。 它是网络通信过程中端点的抽象表示,包含进行网络通信必需的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。 ...
Socket套接字
Socket<em>套接字</em>
阻塞套接字和epoll
要求: 1、从配置文件中读取数据; 2、编写可滚动的日志文件; 3、实现非<em>阻塞</em><em>套接字</em>,应用epoll; 4、实现心跳检测(心跳包); 5、分线程处理   client.c    客户机程序 #include "head.h" #include "config.h" #include "heart_client.h" #define BUFFER_SIZE 40 int main(i
阻塞套接字connect
EINPROGRESS The <em>socket</em> is nonblocking and the connection cannot be completed immediately. It is possible to select(2) or poll(2) for completion by selecting the <em>socket</em> for writing. After...
Linux非阻塞套接字client
linux系统下的非<em>阻塞</em><em>套接字</em>编程的客户端实现
关于非阻塞套接字的问题。
我用j2sdk1.4中的非<em>阻塞</em>模式做了一个服务器端的程序,测试发现:如果我将SelectionKey.OP_READ和SelectionKey.OP_WRITE事件注册到选择器中,服务器程序就在SelectionKey.isWritable()函数中得到客户端的数据;但如果我只将SelectionKey.OP_READ事件注册到选择器中,服务器程序就能在SelectionKey.isReadable()函数中得到客户端的数据,我不知道这是为什么,查了一些资料也没有找到答案,希望大家能够帮我。我的邮箱是:hi_lily@sina.com
套接字socket
一、<em>socket</em>作用 <em>socket</em>----给应用层和传输层之间提供应用程序设计接口(应用编程接口API)。 二、地址结构 1.当应用程序创建<em>套接字</em>时,操作系统会分配一个数据结构来存储该<em>套接字</em>相关信息。 2.使用TCP/IP协议族的网络应用程序声明端点地址变量时,使用结构sockaddr_in struct sockaddr_in { u_char sin_len; //地址长度 u_cha...
socket(套接字)
什么是<em>socket</em> <em>socket</em>(简称 <em>套接字</em> ) 是进程间通信的⼀种⽅式,它与其他进程间通信的⼀ 个主要不同是: 它能实现不同主机间的进程间通信,我们⽹络上各种各样的服务⼤多都是基 于 Socket 来完成通信的 创建<em>socket</em> 在 Python 中 使⽤<em>socket</em> 模块的函数 <em>socket</em> 就可以完成: <em>socket</em>.<em>socket</em>(Addr...
Socket/套接字
目录 1. <em>套接字</em>介绍 2. <em>套接字</em>API 3. 实例 1. <em>套接字</em>介绍 <em>套接字</em>是介于传输层(TCP/UDP)和应用层(HTTP/FTP)之间的一个抽象; 在java环境中<em>套接字</em>编程主要使用TCP/IP协议,但是<em>套接字</em>支持的协议族远不止这些; 在java<em>套接字</em>编程中有Socket和ServerSocket两个核心类,ServerSocket位于服务器端监听连接,Socket位于客户...
fcntl 非阻塞套接字
unix/linux下<em>设置</em><em>套接字</em>为非<em>阻塞</em>式,可以用fcntl函数,但在VC++下有没有相似的函数呢?如果不采用创建异步<em>套接字</em>。
阻塞套接字的连接超时问题
大家好!我以前没注意到这个问题rn就是<em>设置</em>非<em>阻塞</em><em>套接字</em>的连接超时问题,我在网上看到的代码都一样,我现在把这段代码贴出来,请帮忙解惑rnWSADATA wsd;rnSOCKET cClient;rnint ret;rnstruct sockaddr_in server;rnhostent *host=NULL;rnrnif(WSAStartup(MAKEWORD(2,0),&wsd))return 0;rncClient=<em>socket</em>(AF_INET,SOCK_STREAM,IPPROTO_TCP);rnif(cClient==INVALID_SOCKET)return 0;rn//set Recv and Send time outrnDWORD TimeOut=6000; //<em>设置</em>发送超时6秒rnif(::setsockopt(cClient,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)rnreturn 0;rnrnTimeOut=6000;//<em>设置</em>接收超时6秒rnif(::setsockopt(cClient,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)rnreturn 0;rnrn//<em>设置</em>非<em>阻塞</em>方式连接rnunsigned long ul = 1;rnret = ioctl<em>socket</em>(cClient, FIONBIO, (unsigned long*)&ul);rnif(ret==SOCKET_ERROR)return 0;rnrn//连接rnserver.sin_family = AF_INET;rnserver.sin_port = htons(25);rnserver.sin_addr .s_addr = inet_addr((LPCSTR)pSmtp);rnif(server.sin_addr.s_addr == INADDR_NONE)return 0;rnrnconnect(cClient,(const struct sockaddr *)&server,sizeof(server)); //立即返回rnrn//select 模型,即<em>设置</em>超时rnstruct timeval timeout ;rnfd_set r;rnrnFD_ZERO(&r);rnFD_SET(cClient, &r);rntimeout.tv_sec = 15; //连接超时15秒rntimeout.tv_usec =0;rnret = select(0, 0, &r, 0, &timeout);rnif ( ret <= 0 )rnrn::close<em>socket</em>(cClient);rnreturn 0;rnrn第一:如果这端代码是通过select实现的连接超时处理。那为什么把select放在最后,而不是把connect放在select中rn第二:如果这端代码是通过select实现的连接超时处理,把为什么在开始要用setsockopt来<em>设置</em>发送超时。rn请大家帮我解惑,因为我确实没看出来,上段代码哪个地方有连接超时的处理 100相送 谢谢 rn
阻塞套接字与超时时间
请教一下大家,是不是只有将<em>套接字</em><em>设置</em>为非<em>阻塞</em>模式,对recv,send,select等函数<em>设置</em>的超时时间才会有效。rnrn如果我使用一个<em>阻塞</em>的<em>套接字</em>,不<em>设置</em>select函数的超时时间,内核会不会在一段时间后,自动将select返回。
套接字Socket
本文介绍了<em>socket</em><em>套接字</em>的概念
socket 套接字
#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; #include&amp;lt;unistd.h&amp;gt; #include&amp;lt;string.h&amp;gt; #include&amp;lt;sys/types.h&amp;gt; #include&amp;lt;sys/<em>socket</em>.h&amp;gt; #include&amp;lt;netinet/in.h&amp;gt; #include&amp;lt
Linux非阻塞套接字server
linux系统下的非<em>阻塞</em><em>套接字</em>的服务端实现,使用函数fcntl更改<em>套接字</em>为非<em>阻塞</em>,使用select函数和fd宏轮询描述符集,使用stl list管理客户端连接
TCP套接字的非阻塞模式
我创建了一个TCP<em>套接字</em>,然后用ioctl<em>socket</em> (hSocket, FIONBIO, (unsigned long*)&ulTemp);<em>设置</em><em>套接字</em>为非<em>阻塞</em>,再用setsockopt (hSocket, SOL_SOCKET, SO_SNDBUF, (char *)&iTemp, iLen);把TCP<em>套接字</em>的发送缓存区长度<em>设置</em>为100,此时用send()发送1024字节的数据,居然成功了,没有报WSAEWOULDBLOCK错误,这是为什么?
关于非阻塞套接字的读写?????????????????
将<em>套接字</em>sock<em>设置</em>为非<em>阻塞</em>后,用select判断是否可读。rn为什么在FD_ISSET(sock,&rd_set)为真的情况下,使用rnnb=read(sock,buf+end,buf_len-end);rn返回值nb还会出现nb==-1,且errno=EAGAINrn这是为什么啊?rn应该在FD_ISSET(sock,&rd_set)为真的情况下nb几乎不会出现等于-1的情况吧rn
阻塞 connect套接字
非<em>阻塞</em>connect<em>套接字</em>的作用: 1)完成一个connect要花费RTT时间,而RTT波动范围很大,从局域网上的几个毫秒甚至是广域网上的几秒,这段时间也许有我们要执行的其他处理工作可以执行。 2)可以使用这个技术同事建立多个连接。 3)许多connect的超时实现以75秒为默认值,如果应用程序想自定义一个超时时间,就是使用非<em>阻塞</em>的connect.在一个非<em>阻塞</em>的<em>套接字</em>上调用connect,co
Java非阻塞套接字概述
新的Java1.4 I/O体系朝着快速,灵活和可升级的Java应用程序的方向迈进了重要的一大步。看完这篇文章,依靠非<em>阻塞</em><em>套接字</em>技术你可以写一个基于非<em>阻塞</em><em>套接字</em>的应用程序而不用手工来处理多线程。
套接字socket
程序里的"About"里对于本程序的使用说明很清楚了,一些线程的处理我都测试过了,没有问题,希望对于对"<em>socket</em>"感兴趣的朋友有帮助!
socket 套接字
<em>socket</em>的英文原义是“孔”或“插座” 作为进程通信机制 取后一种意思 通常也称作“<em>套接字</em>” 用于描述IP地址和端口 是一个通信链的句柄 其实就是两个程序通信用的
套接字—Socket
网络编程就不得不提大名鼎鼎的<em>套接字</em>—Socket一,什么是Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个Socket。Socket的英文原意是“插座”,通常称之为<em>套接字</em>,来描述IP地址和端口,是一个通信链的句柄,用来实现不同虚拟机或者计算机之间的通信。 在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个S
套接字(Socket)
应该是红色部分有问题,好像是不让初始化Socket,这是什么原因呢rnrnrnpackage <em>socket</em>;rnrnimport java.io.*;rnimport java.net.*;rnpublic class RemoteFileClientrn protected BufferedReader <em>socket</em>Reader;rnprotected PrintWriter <em>socket</em>Writer;rnprotected String hostIp;rnprotected int hostPort;rn//构造方法rnpublic RemoteFileClient(String hostIp,int hostPort)rnrn this.hostIp=hostIp;this.hostPort=hostPort;rn rn//向服务器请求文件的内容rnpublic String getFile(String fileNameToGet)rnrn StringBuffer fileLines=new StringBuffer();rntryrn <em>socket</em>Writer.println(fileNameToGet);rn <em>socket</em>Writer.flush();rn String line=null;rn while((line=<em>socket</em>Reader.readLine())!=null)rn fileLines.append(line+"\n");rn rn catch(IOException e)rn System.out.println("Errorreadingfromfile:"+fileNameToGet);rn rn return fileLines.toString();rnrn//连接到远程服务器rnpublic void setUpConnection()rn tryrn [color=#FF0000]Socket client=new Socket(hostIp,hostPort);[/color] rn<em>socket</em>Reader=new BufferedReader(new InputStreamReader(client.getInputStream()));rn<em>socket</em>Writer=new PrintWriter(client.getOutputStream());rnrncatch(UnknownHostException e)rn System.out.println("Error1settingup<em>socket</em>connection:unknownhostat"+hostIp+":"+hostPort);rn rncatch(IOException e)rn System.out.println("Error2settingup<em>socket</em>connection:"+e);rn rnrn//断开远程服务器rnpublic void tearDownConnection()rn tryrn <em>socket</em>Writer.close();rn <em>socket</em>Reader.close();rn rn catch(IOException e)rn System.out.println("Errortearingdown<em>socket</em>connection:"+e);rn rn rnpublic static void main(String args[])rn RemoteFileClient remoteFileClient=new RemoteFileClient("127.0.0.1",8090);rn remoteFileClient.setUpConnection();rn rn StringBuffer fileContents=new StringBuffer();rn rn fileContents.append(remoteFileClient.getFile("c:\\e.txt"));rn//remoteFileClient.tearDownConnection();rn System.out.println(fileContents);rnrnrn
怎样从阻塞套接字设置为重叠套接字啊?
大家好,如题。能不能将<em>套接字</em>从<em>阻塞</em>模式<em>设置</em>为重叠模式(不是那种用网络事件通知的非<em>阻塞</em>模式哦)。谢谢大家了~
侦听套接字设为非阻塞,那么accept返回的套接字阻塞的还是非阻塞的?
rn侦听<em>套接字</em>的<em>阻塞</em>/非<em>阻塞</em> 与 accept返回的<em>套接字</em>的<em>阻塞</em>/非<em>阻塞</em> 之间有什么关系和影响吗?rnrn请指教
网络编程 套接字阻塞
vc环境下,使用<em>socket</em>无<em>阻塞</em>模式,进行点对点通信。程序包含客户端和服务器端,TCP协议,其中服务器端采用线程的方式接收数据。程序中有详细的注释,适合初学者使用。
阻塞socket套接字网络通信模块
为解决在网络环境复杂的条件下<em>套接字</em>传输数据被分块抵达,导致一次接收不能正确接收完的问题,封装了一个传输类模块,可以保证一次发送的数据,能被一次正确完全接收。 包含模块代码和用例,对外接口简单,使用方便
求教:socket通信时,设置套接字阻塞并select 与 套接字阻塞 区别
网络不太懂,再次求教:rn<em>设置</em><em>套接字</em>非<em>阻塞</em>,这时用select判断是否可读,再recv。如果不可读,可以做其他工作。rn<em>阻塞</em>,是等有数据到来时,recv返回非-1。rnrn那么,rn问题一:一个线程,专门用于接收数据,那选择非<em>阻塞</em>+select还是选择<em>阻塞</em>,又或者其他什么方式?rn问题二:<em>套接字</em>是<em>阻塞</em>,有必要select吗?<em>阻塞</em>的<em>套接字</em>用select有什么用?rnrnrn先拜谢各位大牛!
套接字socket)与socket 编程
字节序: 主机字节序(host byte order):不同的主机有不同的字节序,x86:小端; 网络字节序(network byte order):大端字节序; 0. 什么是<em>套接字</em> <em>套接字</em>是网络进程间的通信(网络进程间通信,又叫 network IPC)接口,进程用该接口能够与其他进程通信,无论是否在同一台计算机上, <em>套接字</em>是对通信端点的抽象,就...
ioctlsocket设置套接字阻塞,怎么不起作用呢?
1:开一个工作线程。其中循环接收消息,如下rn [code=C/C++] DWORD WINAPI RecvThreadProc(LPVOID p)rn rn ...rn while (TRUE)rn rn if(SOCKET_ERROR==recvfrom(m_RecvSocket,buff,sizeof(buff),0,(sockaddr *)&addrRemote,&nlen))rn rn rn AfxMessageBox("接收数据失败!");rn return -1;rn rn rnrn ...rn [/code]rn2:想停止该线程如何做,rn 我们的办法是:rn rn[code=C/C++] //将<em>套接字</em>设为非<em>阻塞</em>,导致recvfrom离开返回rn DWORD dwNoblock=1; rn ioctl<em>socket</em>(m_RecvSocket,FIONBIO,(u_long FAR*) &dwNoblock);[/code]rnrn 上面<em>设置</em>后,recvfrom依然<em>阻塞</em>,线程函数并不能立即返回rnrn 为什么呢???rn
请教怎么设置阻塞套接字的数据缓冲区不可用
rn[code=C/C++]rnint val = send(pClient->m_<em>socket</em>, pClient->m_data.buf, nSendlen,0);rn //处理返回错误rn if (SOCKET_ERROR == val)rn rn int nErrCode = WSAGetLastError();rn if (nErrCode == WSAEWOULDBLOCK)//发送数据缓冲区不可用rn rn continue;rn else if ( WSAENETDOWN == nErrCode || rn WSAETIMEDOUT == nErrCode ||rn WSAECONNRESET == nErrCode)//客户端关闭了连接rn [/code]rnrn书上说数据缓冲区不可用时,WSAGetLastError()得到的是 WSAEWOULDBLOCK ,那什么样的数据缓冲区算不可用?rnrn做个试验:在<em>阻塞</em>模式下 memset(pClient->m_data.buf,0,len),还可发送,应该能证明缓冲区可不可用和这内容无关rnrn那这函数是怎么判断的?
为什么要不套接字设置成为非阻塞模式
为什么要把<em>套接字</em><em>设置</em>为非<em>阻塞</em>模式?rn与<em>阻塞</em>模式比较,非<em>阻塞</em>模式有什么优势?rn什么情况下用非<em>阻塞</em>模式?rnrn<em>套接字</em><em>设置</em>非<em>阻塞</em>方法:rn一种是:通过fcntl(fd, F_SETFL, NOBLOCK)加select;rn第二种:直接是select();rnrn请各个大侠指教!!![img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/2.gif][/img]
套接字设置
<em>套接字</em><em>设置</em>      利用<em>套接字</em>能完成很多丰富得应用,但要想利用<em>套接字</em>实现更复杂得应用,必定会涉及到调整<em>套接字</em>属性,通过调整<em>套接字</em>属性,能够实现广播、组播、地址重用、数据缓冲区以及数据超时处理等功能。 int getsockopt(int sockfd, int level, int optname,  void *optval, socklen_t *optlen); int setsockop...
Windows Socket套接字(四)-Windows套接字错误代码
WSAGetLastError函数 int WSAGetLastError(void); 返回值表示该线程的最后一个Windows Sockets操作失败的错误代码。 在Winsock应用程序中,使用WSAGetLastError函数检索错误代码 ,Windows Sockets替代WindowsGetLastError函数 这些错误代码和与错误代码相关联的短文本描
JAVA套接字(Socket)三 套接字初体验
[b]一个秘密的<em>套接字</em> 1. 介绍[/b] Java 平台在 java.net 包中提供<em>套接字</em>的实现。在本教程中,我们将与 java.net 中的以下三个类一起工作: URLConnection Socket ServerSocket java.net 中还有更多的类,但这些是您将最经常碰到的。让我们从 URLConnection 开始。这个类为您不必了解任何底层<em>套接字</em>细节就能在 J...
阻塞套接字问题,在线等待~~
将<em>套接字</em><em>设置</em>为非<em>阻塞</em>状态后, 调用recvfrom(cli,buf,20,0,(sockaddr*)&client,(int FAR *)&len);rn如果接受到消息返回什么值,没有接受到返回什么值???
阻塞套接字执行connect()的问题
最近遇到一个很奇怪的问题,在winsock中,使用ioctl<em>socket</em>将<em>套接字</em><em>设置</em>为nonblock,但如果调用connect连接一个存在的机器的非法端口,则需要约2s的时间,而连接一个不存在机器则需要20s左右,这不是和block方式一样吗?rn然而,同样的程序,在某些机器上需要的时间为0,也就是说确实以noblock的方式在工作了。rn很奇怪,是不是与安装了sniffer软件有关?rn哪位高手指点一下,谢谢。rnrn程序代码如下:rn#include "stdafx.h"rn#include rn#include rnrnusing namespace std;rnrnint inet_aton( const char* cp, struct in_addr* inp )rnrn UINT32 addr = inet_addr( cp );rn if( addr == INADDR_NONE ) return 0;rn inp->s_addr = addr;rn return 1;rnrnrnint _tmain(int argc, _TCHAR* argv[])rnrn WSAData wsaData;rnrn if( WSAStartup(MAKEWORD(2,2), &wsaData) != 0 )rn rn cout<<
阻塞套接字的应用___远程计算器
基于非<em>阻塞</em><em>套接字</em>的一个远程计算器。功能很小,但是涉及到的多线程管理可以参考
选择模型--非阻塞套接字详解
0x01什么是选择模型 普通<em>套接字</em>编程,常常会遇到<em>阻塞</em>主进程,比如recv,read等,如果没有数据发过来会一直等待。有没有办法让进程等待一段时间,再退出呢。这时候使用选择模型就能解决这个问题。 原理–I/O多路复用:通过一个fd_set集合来管理<em>套接字</em>,当某个<em>socket</em>可读或者可写的时候,它可以给你一 个通知。这样配合非<em>阻塞</em>的<em>socket</em>使用时,只有当系统通知我哪个描述符可读了,我才去执行re...
在非阻塞套接字中实现序列化
java1.3中的新类Buffer实例只能包含基本类型。在一非<em>阻塞</em><em>套接字</em>程序中,如果想要传送一个自定义的对象,那么首先要使这个对象能序列化成网络字节流,根据java的要求,在实现Serializable接口后要添加两个函数 private void writeObject(ObjectOutputStrem out) throws IOExceptionrn和private void readObject(ObjectInputStream in) throws IOException ,ClassNotFoundExceptionrn现在我想知道如何把一个数据报(含各种类型的数据) 序列化成一个字节流后放入ByteBuffer?rnrn
阻塞套接字如何执行connect
继承自CAsyncSocket的<em>套接字</em>执行connect时出错,用GetLastError时得到10035要求<em>阻塞</em>,我重载了OnConnect函数,但是它没有被触发,请高手指点
socket中的阻塞和非阻塞
我用的UDP。rn[code=c]rnm_hSock = <em>socket</em>(AF_INET, SOCK_DGRAM, 0);rn if(INVALID_SOCKET == m_hSock)rn rn g_log.Write(_T("创建<em>socket</em>失败..."),GetLastError());rn return FALSE;rn rn //<em>设置</em><em>socket</em>为非<em>阻塞</em>模式rn u_long iMode = 1;rn if (SOCKET_ERROR == ioctl<em>socket</em>(m_hSock, FIONBIO, &iMode))rn rn g_log.Write(_T("<em>设置</em>非<em>阻塞</em><em>socket</em>失败..."),GetLastError());rn return FALSE;rn rnrn BOOL opt = TRUE;rn setsockopt(m_hSock, SOL_SOCKET, SO_REUSEADDR, (char *)&opt,sizeof (opt)); rnrn g_log.Write(_T("<em>socket</em>为:"),m_hSock);rn ZeroMemory(&m_AddrDst,sizeof(SOCKADDR_IN));rn m_AddrDst.sin_family = AF_INET;rn m_AddrDst.sin_addr.s_addr = inet_addr(m_IpAddress);rn m_AddrDst.sin_port = htons(UDP_COMMON_PORT);rn if (0 != connect(m_hSock,(sockaddr*)&m_AddrDst,sizeof(SOCKADDR_IN)))rn rn g_log.Write(_T("连接<em>socket</em>失败..."),GetLastError());rn return FALSE;rn rn<em>设置</em>了<em>socket</em>为非<em>阻塞</em>。rn然后我变开始发送信息和接收信息。rn发送和接收信息的函数为:rnBOOL UDP_Send(SOCKET nSocket,LPVOID lPdata,int nLen,sockaddr_in* addr)rnrn int nSendLen = 0;rn int nRet = 0;rn while(nLen > nSendLen)rn rn nRet = sendto(nSocket,(char*)lPdata+nSendLen,nLen - nSendLen,0,(sockaddr*)addr,sizeof(struct sockaddr_in));rn if (SOCKET_ERROR == nRet)rn rn if(10035 == GetLastError())rn rn Sleep(2);rn continue;rn rn g_log.Write(_T("发送信息失败..."),GetLastError());rn return FALSE;rn rn nSendLen += nRet;rn rn return TRUE;rnrnrnBOOL UDP_Recv(SOCKET nSocket,LPVOID lPdata,int nLen,sockaddr_in* addr)rnrn int nRecvLen = 0;rn int nRet = 0;rn int nAddLen = sizeof(struct sockaddr_in);rn while (nLen > nRecvLen)rn rn nRet = recvfrom(nSocket,(char*)lPdata+nRecvLen,nLen - nRecvLen,0,(sockaddr*)addr,&nAddLen);rn if (SOCKET_ERROR == nRet)rn rn if(10035 == GetLastError())rn rn Sleep(2);rn continue;rn rn g_log.Write(_T("接收信息失败..."),GetLastError());rn return FALSE;rn rn nRecvLen += nRet;rn rn return TRUE;rnrn我在来个循环接收:rn while(TRUE)rn rnbRes = UDP_Recv(m_hSock,(char*)&Msg,sizeof(Msg),&sockAddr);rn if (FALSE == bRes)rn rn break;rn rn if(NET_FLAG != Msg.dwNetFlag)rn rn m_bRecv = FALSE;rn break;rn rnrn switch(Msg.dwCMD)rn rn rn case NETCMD_NETWORK_DEVREBOOT_RESP:rn m_bRecv = TRUE;rn return;rn case NETCMD_NETWORK_FACTORYRES_RESP:rn m_bRecv = TRUE;rn return;rn case NETCMD_NETWORK_DEVPRARM_RESP:rn m_bRecv = TRUE;rn return;rn case DEV_UDPMSG_DEVNTP_RESP:rn m_bRecv = TRUE;rn return;rn default:rn return;rn rnrn rn[/code]rn 按照道理来讲,这个应该不会出现<em>阻塞</em>现象啊,为什么我的会出现<em>阻塞</em>现象呢?有一个信息就是服务器没有收到我发送的信息,但是我这边表示发送成功(有人说是放到缓冲区了,主机没接收)。但是应该不至于我的recvfrom函数<em>阻塞</em>吧。大神们,能看出来是什么原因么,或者说可能引发的因素!
socket阻塞和非阻塞
一、<em>socket</em><em>阻塞</em>和非<em>阻塞</em>有哪些不同 1. 建立连接 <em>阻塞</em>方式下,connect首先发送SYN请求到服务器,当客户端收到服务器返回的SYN的确认时,则connect返回,否则的话一直<em>阻塞</em>。 非<em>阻塞</em>方式,connect将启用TCP协议的三次握手,但是connect函数并不等待连接建立好才返回,而是立即返回,返回的错误码为EINPROGRESS,表示正在进行某种过程。 2. 接收连接 <em>阻塞</em>模式下调用...
阻塞socket阻塞send
由于种种原因,客户端的<em>socket</em>要<em>设置</em>成非<em>阻塞</em>的,主要是connect函数要非<em>阻塞</em>,但是传输数据的时候又希望send和recv是<em>阻塞</em>的,因为实现了多线程,如果非<em>阻塞</em>的话会麻烦点。rn请教高手,能不能单独<em>设置</em>send的<em>阻塞</em>或者非<em>阻塞</em>,还是再<em>设置</em>一次<em>socket</em>的属性?
阻塞socket和非阻塞socket(一)
刚开始做项目时,要用到<em>socket</em>通信。那时为了弄清<em>socket</em>编程做了几个实验,主要是针对send和recv在几种特殊的情况下的返回值。 <em>阻塞</em><em>socket</em>:    特殊情况(1):在接收端和发送端正常频繁的接受和发送时,突然关闭接收端的<em>socket</em>(优雅的关闭,调用close<em>socket</em>函数),此时的发送端的send函数返回-1,WSAGetLastError 的编码为10054.代表W
阻塞socket和非阻塞socket(二)
非<em>阻塞</em><em>socket</em>: 一般在项目中我们很多情况下都是有多个<em>socket</em>传输数据,而管理多个<em>socket</em>有几种I/O模型。如<em>select模型</em>、WSAAsyncSelect模型、WSAEventSelect模型、Overlapped I\O模型、完成端口等等。 根据项目的具体的情况选择相应的I\O模型。我在项目中用到最多的就是WSAAsyncSelect模型、WSAEventSelect模型这
Berkeley socket 套接字
在80 年代早期,远景研究规划局(Advanced Research Projects Agency, ARPA)资助了 佳利福尼亚大学伯克利分校的一个研究组,让他们将TCP/IP 软件移植到UNIX 操作系统 中,并将结果提供给其他网点。作为项目的一部分,设计者们创建了一个接口,应用进程 使用这个接口可以方便的进行通信。他们决定,只要有可能就使用以有的系统调用,对那 些不能方便的容入已有的函数集的情况,就再增加新的系统调用以支持TCP/IP 功能。 这样做的结果就出现了插口接口(Berkeley Socket),这个系统被称为Berkeley UNIX 或BSD UNIX。(TCP/IP 首次出现在BSD 4.1 版本release 4.1 of Berkeley Software Distribution)。 由许多计算机厂商,都采用了Berkeley UNIX,于是许多机器上都可以使用Socket 了。 这样,Socket 接口就被广泛使用,到现在已经成为事实上的标准。(图6-1)
socket套接字源代码
<em>socket</em><em>套接字</em>源代码,包括单线程 多线程 线程池,客户端和服务器端的都包含,其中还加入了庖丁分词
Java Socket套接字
一篇讲Java Socket<em>套接字</em>的小文章,不过里面讲的还不错。对于像学习Java Socket基础的人来说可以下载看看,我也顺便挣点分。 :)
socket套接字及缓冲区详解
  <em>套接字</em>是一种通信机制(通信的两方的一种约定),凭借这种机制,不同主机之间的进程可以进行通信。我们可以用<em>套接字</em>中的相关函数来完成通信过程。   <em>套接字</em>的特性有三个属性确定,它们是:域(domain),类型(type),和协议(protocol)。 #include&amp;amp;amp;lt;sys/types.h&amp;amp;amp;gt; #include&amp;amp;amp;lt;sys/<em>socket</em>.h&amp;amp;amp;gt; int <em>socket</em>(int dom...
如何编写Socket套接字
Socket<em>套接字</em>相当于网络通信两端的插座,只要对方的Socket和自己的Socket有通信联接,双方就可以发送和接收数据。其定义类似于文件句柄的定义。 如果编写的是服务程序,那么先调用<em>socket</em>()创建一个<em>套接字</em>,调用bind()绑定IP地址和端口,然后启动一个死循环,循环中调用accept()接受连接。对于每个接受的连接,可以启动多线程方式进行处理,在线程中调用send()、recv()发
java网络编程--socket套接字
Java 网络编程网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。 java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。 java.net包中提供了两种常见的网络协议的支持: TCP: TCP是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称TC
学学网络之Socket套接字
<em>套接字</em>概念 Socket本身有“插座”的意思,在Linux环境下,用于表示进程间网络通信的特殊文件类型。其本质为内核借助缓冲区形成的伪文件。因为我们常说,Linux下一切皆文件。 既然是文件,那么理所当然的,我们使用文件描述符引用<em>套接字</em>。与管道类似的,Linux系统将其封装成文件的目的是为了统一接口,使得读写<em>套接字</em>和读写文件的操作一致。区别是管道主要应用于本地进程间通信,而<em>套接字</em>多应用于网络进程...
socket套接字原理
我们知道进程通信的方法有管道、命名管道、信号、消息队列、共享内存、信号量,这些方法都要求通信的两个进程位于同一个主机。但是如果通信双方不在同一个主机又该如何进行通信呢?在计算机网络中我们就学过了tcp/ip协议族,其实使用tcp/ip协议族就能达到我们想要的效果,如下图: 当然,这样做固然是可以的,但是,当我们使用不同的协议进行通信时就得使用不同的接口,还得处理不同协议的各种细节,这就增加了开发...
socket 套接字是什么
参考资料: 1、对Socket通信的一些简单理解 https://www.jianshu.com/p/9fbf9b78e2c0 2、从问题看本质:<em>socket</em>到底是什么? http://blog.csdn.net/yeyuangen/article/details/6799575 3、TCP/IP、Http、Socket的区别 http://lib.csdn.net/article/c...
socket套接字的作用范围?
本人自己写了一个<em>socket</em><em>套接字</em>的服务器和客户端的程序,可以通过ip地址连接到服务器,在学校实验室的局域网可以通过网络的ip地址连接起来,但是别的地方的电脑就无法通过网络输入服务器ip地址连接到服务器,请问怎么回事呢?与防火墙等有关系吗?还是只能作用在局域网内部呢?求各位大侠解答~~,感谢
socket(套接字)到底是什么?
不知道各位大虾能否指点一下,给个定义。看了很多书,还是不太明白这个概念。
CISCO 小凡模拟器(DynamipsGUI)下载
小凡模拟器(DynamipsGUI) 学习网络的没有设备作实验可以用小凡的模拟器这个版本经测试好用,不像一些版本联网老是要升级的。学思科CCNA的好软件。 相关下载链接:[url=//download.csdn.net/download/maciqian/2155531?utm_source=bbsseo]//download.csdn.net/download/maciqian/2155531?utm_source=bbsseo[/url]
java程序判断文件编码的类型下载
这个文档教你如何,判读不同的文件编码类型,gbk,utf-8等等 相关下载链接:[url=//download.csdn.net/download/b549617558/4750330?utm_source=bbsseo]//download.csdn.net/download/b549617558/4750330?utm_source=bbsseo[/url]
Inno Setup Base64编码解码函数下载
Inno Setup中没有提供处理Base64编码和解码的函数,一般遇到Base64编码时需要使用额外的工具。 本Inno Setup脚本代码可直接嵌入到[Code]使用,简单方便。 相关下载链接:[url=//download.csdn.net/download/kunnywang/7080651?utm_source=bbsseo]//download.csdn.net/download/kunnywang/7080651?utm_source=bbsseo[/url]
相关热词 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池 c#5.0 安装程序 c# 分页算法 c# gmail 发邮件 c# 多层文件
我们是很有底线的