connect函数

TCP客户用connect函数来建立与TCP服务器的连接

int connect (int sockfd, const sockaddr * servaddr, socklen_t addrlen);

sockfd是由socket函数返回的套接字描述符

servaddr指向套接字地址结构的指针

addrlen指向该结构的大小的指针

客户在调用函数connect 之前不必非要调用bind函数,因为如果需要的话,内核会确定源IP地址,并选择一个临时端口作为源端口

如果是TCP套接字,调用connect函数将会激发TCP的三次握手过程,而且仅仅在连接建立成功或出错时才返回,出错情况如下:

1)若TCP客户没有收到SYN分节的响应,则返回ETIMEOUT错误

2)若对客户的SYN的响应是RST(表示复位),则表明该服务器主机在我们指定的端口上没有进程在等待与之连接

这是一个硬错误,客户一接收到RST就马上返回ECONNREFUSED错误

产生RST的三个条件:

目的地为某端口的SYN到达,然而该端口上没有正在监听的服务器;

TCP想要取消一个已有连接;

TCP接受到一个根本不存在的链接上的分节。

3)若客户发出的SYN在中间的某个路由器上引发一个"destination unreachable"(目的地址不可达)ICMP错误,则认为是一种软错误

客户主机内核保存该消息,并按第一种情况中所述的时间间隔继续发送SYN,若在某个规定时间后仍然未收到相应,则把保存的消息(ICMP错误)作为EHOSTUNREACH或ENETUNREACH错误返回给进程

时间: 2024-11-02 18:59:28

connect函数的相关文章

linux 非阻塞 connect函数

开发测试环境:虚拟机CentOS,windows网络调试助手        非阻塞模式有3种用途        1.三次握手同时做其他的处理.connect要花一个往返时间完成,从几毫秒的局域网到几百毫秒或几秒的广域网.这段时间可能有一些其他的处理要执行,比如数据准备,预处理等.        2.用这种技术建立多个连接.这在web浏览器中很普遍.        3.由于程序用select等待连接完成,可以设置一个select等待时间限制,从而缩短connect超时时间.多数实现中,connec

connect函数的用法

无论流式套接字(如TCP)还是数据报(如UDP),均可以使用connect函数.对于流式套接字,使用connect函数后,建立固定地址的连接,之后可以使用send/rev函数进行数据收发.对于数据报,可以不使用connect函数进行连接.此时需要使用sendto/revfrom函数进行收发,且每一次收发都要指明收发地址.也可以像流式套接字那样使用connect函数建立固定连接,然后使用send/rev函数进行收发.此时不需要每次收发都指定地址,但是也意味着只能向一个固定地址收发数据.另外注意,一

connect函数详解

不得不说,客户端的connect函数和服务端的accept函数是一对好基友,如果客户端没有去connect, 那么服务端的accept会一直在那里傻傻地痴痴地等待,我们先来看看connect函数的原型吧: WINSOCK_API_LINKAGE int WSAAPI connect( SOCKET s, const struct sockaddr FAR * name, int namelen ); 第一个参数是客户端的套接字(表明即将发起连接请求),第二个参数是服务端的套接字所在的“地方”(“

【网络编程】——connect函数遇见EINTR的处理

最近在公司项目中突然报错如下 “connect: Interrupted system call”, 经过查找代码发现是在创建 socket 中执行了 connect 函数失败导致.上网查阅资料发现这是 信号中断EINTR 与 慢系统调用 的问题. 慢系统调用:可能永远阻塞的系统调用. EINTR说明:如果进程在一个慢系统调用(slow system call)中阻塞时,当捕获到某个信号且相应信号处理函数返回时,这个系统调用被中断,调用返回错误,设置errno为EINTR(相应的错误描述为“In

udp 调用connect函数

结论: udp可以调用connect函数. udp可以多次调用connect函数. udp调用connect作用: 发送端:我们不需要再次指定也不能指定端口和ip地址 接收端:不必使用类似recvfrom的函数来获得数据报的发送者,一个已连接的udp套接字只与一个ip地址交换数据 已连接的udp如果错误会返回给发送端 udp多次调用connect作用: 指定一个新的ip和端口 断开套接字 适用于udp一对一的经常不断发送数据的情况,可以提高效率. 比如: 未connect的udp发送数据为,建立

QT QObject::connect函数的学习

从Qobject(QObject.h)源码中可以看到QObject::connect的定义是这样的: [cpp] view plaincopy static bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType = #ifdef qdoc Qt::AutoConnection #else #ifdef QT3_S

UDP连接调用connect()函数

UDP是一个无连接的协议,它没有像TCP中EOF之类的东西. 8.11 UDP的connect函数 除非套接字已连接,否则异步错误是不会反悔到UDP套接字的.我们确实可以给UDP套接字调用connect,然而这样做的结果却与TCP连接不同的是没有三路握手过程.内核只是检查是否存在立即可知的错误,记录对端的IP地址和端口号,然后立即返回调用进程. 对于已连接UDP套接字,与默认的未连接UDP套接字相比,发生了三个变化. (1)我们再也不能给输出操作指定目的IP地址和端口号.也就是说,我们不使用se

QObject成员函数connect()函数

1:首先要链接的两个类必须继承于QObject,同时添加 Q_OBJECT. 2:在qt中QObject::connect中填写的signal和slot函数,一定要填写参数类型. 因为类中的函数可以,也就是,重载函数名一样,参数不一样,如果QObject::connect中的函数没有参数类型,则无法正确连接. 3:QObject::connect中的signal 和 slot 函数一定要有参数类型, 但是,不可以有参数: You must use the SIGNAL() and SLOT()

QT connect函数的第五个参数

enum ConnectionType {AutoConnection,DirectConnection,QueuedConnection,AutoCompatConnection,BlockingQueuedConnection,UniqueConnection = 0x80}; 在QT中我们通常会使用connect函数,它是连接信号与槽的一种函数,通常使用的时候都是使用四个参数,但它还有第五个参数,只是一般都是使用的是默认参数. Qt::AutoConnection: 默认值,使用这个值则连