- 浏览: 271961 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
AndMacLinuXp:
试了下,不错!
printk内核调试 -
klose:
我引用你的文章,并做了简单的分析:这里贴出url:http:/ ...
linux系统调用fork, vfork, clone -
klose:
你上面提到的问题:free的问题。首先你可能疏忽了,stack ...
linux系统调用fork, vfork, clone -
qwe_rt:
HI ,非常nice的文章,在阅读过程中,我发现我的ubunt ...
linux手动添加开机启动的服务 -
suifeng:
谢谢分享, 受用中.
shell编程分支,循环
connect非阻塞套接口时候,一般使用在以下几种情况:
1.三路握手需要时间,这个要视具体的网络情况而定。当然也有可能失败。在三路握手的时候我们并不需要在原地等待三路握手的完成,可以用这些时间来 完成其它事情,然后当这些事情完成后,再去检测连接是否建立(也就是三路握手是否完成)。
2.可以用这种技术来同时建立多个连接。(WEB浏览器中很常用)。
3.connect超时需要很长时间才会通知,如果我们认为超过0.1秒以后就算超时(不管它是不是真的超时),这是就可以使用非阻塞式I/O结合 select来完成。
当采用非阻塞式I/O来使用connect时候,要判断一个连接是否建立则比较复杂,需要按照以下几个步骤来完成
1.即使是使用非阻塞式的connect操作,connect依然可能正确返回,也就是说非阻塞的connect 也有可能三路连接完成后返回,这种情况一般发生在服务器和主机在同一个机器上,所以第一步要判断connect是否正确返回,如果正确返回则请做正确返回 的处理,否则进入步骤2
2.设置fd_set,(如果没看明白,请先看select函数介绍),让select函数同时监听套接字的读写2个属性,如果既可读也可写则进入 步骤3,如果可写但不可读进入步骤4.
3.如果到达这步,我们需要调用getsockopt进一步判断。这里涉及到一个移植问题,getsockopt如果发生错误, 源自Berkeley的实现会返回0,如果是solaris,则会返回-1。建议是2个都处理(如果看不明白请先看getsockopt函数,套接口选 项)。根据getsockopt通过参数返回的erron的值,如果值为0则表示链接建立完成,如果不为0, 则说明链接建立没有完成。
4.如果能到达这里,则说明连接建立完成。
最后,即使最后你得出链接没有建立完成,也只是说:可能三路握手的过程还是没有完成。
代码:
服务器
#include "/programe/net/head.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define MAXSIZE 100
//如果这样写,最后返回的套接口应该是会进入步骤3,也就是套接口既可读也可写,如果想进入步骤4,就不要想套接口中写入数据
int main(int argc, char ** argu) {
int listenfd, connfd;
struct sockaddr_in servaddr;
char buf[MAXSIZE + 1];
char buf2[] = "hello world\n";
listenfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(atoi(argu[1]));
bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
listen(listenfd, 10);
for(;;) {
connfd = accept(listenfd, (struct sockaddr *)NULL, NULL);
write(connfd, buf2, sizeof(buf2));
close(connfd);
}
}
客户端
#include "/programe/net/head.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "unistd.h"
#include "fcntl.h"
#include "sys/select.h"
#define MAXSIZE 100
int main(int argc, char ** argv) {
int sockfd, n;
int my;
char send_buf[MAXSIZE + 1];
char recv_buf[MAXSIZE + 1];
struct sockaddr_in servaddr;
int error = 0;
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("create socket error\n");
exit(1);
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(atoi(argv[1]));
if(inet_pton(AF_INET, "192.168.1.235" , &servaddr.sin_addr) < 0) {
printf("inet_pton error\n");
exit(1);
}
int val = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, val | O_NONBLOCK); //设置套接口非阻塞
int connect_flag = connect(sockfd, (struct sockaddr *)&servaddr, sizeof(struct sockaddr_in));
sleep(2); //connect会立即返回,不同于之前的要阻塞到链接完成才会返回,这里可以做你想在等待连接完成的时间想做的事情,我这里只是让进程睡眠了一段时间
if(connect_flag >= 0) {
printf("connect success\n"); //即使是非阻塞套接口,connect还是有可能正确返回的,这种情况要处理
goto done; //不建议使用goto
}
fd_set rest, west;
FD_ZERO(&rest);
FD_ZERO(&west);
FD_SET(sockfd, &rest);
FD_SET(sockfd, &west);
int maxpd = sockfd + 1;
int flag = select(maxpd, &rest, &west, NULL, NULL);//监听套接的可读和可写条件
if(flag < 0) {
printf("select error\n");//慢系统调用可能会错误返回,这个以前提过
exit(1);
}
if(FD_ISSET(sockfd, &rest) && FD_ISSET(sockfd, &west)) {//如果套接口及可写也可读,需要进一步判断
socklen_t len = sizeof(error);
if(getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
exit(1);//获取SO_ERROR属性选项,当然getsockopt也有可能错误返回
printf("error = %d\n", error);
if(error != 0) {//如果error不为0, 则表示链接到此没有建立完成
printf("connect failed\n");
exit(1);
}
//如果error为0,则说明链接建立完成
}
if(FD_ISSET(sockfd, &west) && !FD_ISSET(sockfd, &rest)) { //如果套接口可写不可读,则链接完成
printf("connect success\n");
}
done:
int recv_buf_len = read(sockfd, recv_buf, MAXSIZE);
recv_buf[recv_buf_len] = '\0';
printf("get message:%s", recv_buf);
close(sockfd);
exit(0);
}
发表评论
-
hdfs集群搭建
2014-05-11 17:19 1054网上很多hadoop集群搭建的文章,我这里只写下hdfs,不 ... -
网站性能优化
2013-10-25 10:43 0好久没写了,最近一直在做些互联网的一些东西。下面介绍些性能优 ... -
html5学习网站
2011-07-29 14:55 984htm5:http://www.w3school.com.cn ... -
HTTP下载
2011-02-09 15:24 1141HTTP下载的关键是修改Content-Type。 C ... -
28.sniffer程序2
2010-07-01 17:51 1810对前面27中sniffer中的一 ... -
27. sniffer程序
2010-06-30 11:51 5971网络抓包,必需从数据链路层开始抓取,至于原因之前在原始套接口中 ... -
java 和 linux c udp通信的样例
2010-05-28 11:58 2511一个简单的例子 java段(客户端) package ... -
26.原始套接字
2010-05-12 16:45 1850一个小程序: //发送方 #include <sys ... -
25.cookies和session
2010-05-10 15:21 993原文出自:http://blog.csdn ... -
24.SOCKET模拟HTTP请求
2010-05-07 14:11 5393HTTP请求头部样例: GET http://www.bai ... -
23.广播
2010-04-29 16:34 979如果想发送广播到目前为止只能使用AF_INET, SOCK_D ... -
21.非阻塞I/O
2010-04-27 16:54 2105设置一个I/O成为非阻塞很简单,只需要: int val = ... -
20.辅助数据 和 传输描述字
2010-04-26 15:53 2129打开一个文件或者一个 ... -
19.unix域协议与TCP UDP不同之处
2010-04-22 13:46 2681之前说过一些区别,但基本对我们编程来说没有太多影响,但以下几个 ... -
18.unix域协议
2010-04-21 16:47 2668UNIX域协议并不是一个真正的协议族,它是用在同一台主机上进行 ... -
17.I/O函数recvmsg与sendmsg
2010-04-20 15:58 12512想对于之前的几个IO函 ... -
16.I/O函数
2010-04-20 13:51 1293最早使用的read与write函 ... -
15.服务器守护进程
2010-04-16 17:44 1434前面提到过的服务器都占有控制终端。而有些进程并不需要控制终端。 ... -
14.udp与connect
2010-04-13 16:41 3264UDP在调用sendto发送数据 ... -
13.UDP编程
2010-04-09 17:16 2329虽然UDP不保证传输的可 ...
相关推荐
Linux 客户端Socket 非阻塞 connect 编程详解 本文档详细介绍了 Linux 客户端 Socket 非阻塞 connect 编程的实现方法和原理。非阻塞 connect 是一种高效的网络编程技术,能够提高程序的性能和可靠性。 一、非阻塞 ...
Linux 客户端 Socket 非阻塞 connect 编程收集 本文档主要讨论了 Linux 客户端 Socket 非阻塞 connect 编程的实现与应用,非阻塞 connect 编程的主要用途有三种: 1. 三次握手同时做其他的处理。在 connect 过程中...
网络实现非阻塞connect,select带超时
总之,"C++ TCP客户端非阻塞连接超时测试源码"是一个实用的示例,它展示了如何在C++中处理TCP连接的非阻塞和超时问题,这对于开发高可用性和高性能的网络应用程序至关重要。通过学习和分析这段代码,开发者可以提升...
在软件开发领域,尤其是在涉及输入输出(IO)操作时,理解同步与异步、阻塞与非阻塞的概念是非常重要的。这些概念对于设计和实现高效的程序至关重要,尤其是在高并发和分布式系统中。 一、同步与异步 同步和异步是...
非阻塞TCP的一个挑战在于处理连接建立期间的“半连接”状态,此时`connect()`可能返回一个错误,但实际连接可能仍在进行。这被称为EINPROGRESS错误,需要在客户端进行适当的重试或超时处理。 总结起来,非阻塞TCP...
在QTcpSocket的编程中,我们经常会遇到阻塞和非阻塞两种模式的选择。这两种模式在处理网络通信时有着不同的行为和应用场景。 首先,阻塞模式意味着在执行某些操作(如连接、读取或写入数据)时,QTcpSocket会暂停...
非阻塞Java通信是一种高效的网络编程模式,它允许程序在等待数据就绪时继续执行其他任务,而不是简单地挂起,直到数据准备完毕。这种方式提高了系统资源利用率和并发能力,尤其适用于高并发的网络服务。在Java中实现...
在非阻塞模式下,如果连接尚未完成,`connect()`会立即返回错误`EINPROGRESS`。 4. **I/O复用**:使用`select()`、`poll()`或`epoll()`函数监控连接状态,等待连接完成或超时。 5. **发送和接收数据**:使用`send...
Linux下的Socket编程实例(阻塞和非阻塞) 通过分析给定的文件信息,我们可以生成以下知识点: Socket编程概述 Socket 编程是指使用操作系统提供的 socket 编程接口来实现网络通信的编程方式。Socket 编程可以实现...
非阻塞TCP/IP通信是一种高效的网络编程模型,它在处理大量并发连接时具有显著优势。在传统的阻塞模式下,一个套接字调用(如recv或send)会一直阻塞,直到有数据可读或发送空间可用。然而,在非阻塞模式下,这些调用...
5. **异步编程**:如果`Snd_conn_req`是在异步环境中执行的,那么可能涉及到事件驱动编程、回调函数或者Promise对象,以处理网络操作的非阻塞特性。 6. **多线程或多进程**:在并发环境下,可能需要使用多线程或多...
在Python编程中,多线程和非阻塞的Socket技术是构建高效网络应用程序的关键组成部分。本文将深入探讨如何在Python中实现多线程非阻塞的Socket服务端和客户端,以提升并发处理能力。 首先,让我们理解“多线程”和...
在本文中,我们将探讨如何使用Erlang的OTP(Open Telecom Platform)原则构建一个非阻塞的TCP服务器。OTP为开发健壮、容错的应用提供了强大的框架,它包含了一系列行为模式,如gen_server和gen_fsm,这些模式可以...
本篇将深入讲解基于VC2010环境下的非阻塞TCP(Transmission Control Protocol)网络编程。非阻塞模式允许程序在等待数据到来时,不被阻塞并可以执行其他任务,从而提高系统的效率和响应性。 首先,我们要理解TCP的...
阻塞与非阻塞通信是计算机网络编程中的两种基本通信方式,主要涉及到Java NIO(Non-blocking Input/Output,非阻塞输入/输出)框架。Java NIO 提供了一种新的方式来处理I/O操作,使得程序在进行读写操作时,不再必须...
### 非阻塞异步传输Java网络编程 #### 实验背景及目标 本实验旨在通过Java语言实现一种基于自定义协议的文件传输系统,包括一个文件传输服务器(FileServer)和一个客户端(FileClient)。该系统的特点在于采用了非...
- **连接操作**:非阻塞模式下,connect()方法如果连接未完成,会立即返回,需要通过选择器监控连接状态。 4. **读写操作** - **read()和write()**:这两个方法在非阻塞模式下,如果缓冲区无数据可读或无空间可写...
通过以上介绍,我们可以看到在Windows环境下设置socket连接超时的主要步骤包括:建立socket、设置非阻塞模式、调用connect、使用select检测socket状态、判断connect结果以及最后将socket恢复为阻塞模式。这些步骤...