connect非阻塞,send和recv是阻塞的,会影响发送和接收吗?
SOCKET/*int*/ sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sockfd < 0)
{
return;
}
struct sockaddr_in serv_addr;
//以服务器地址填充结构serv_addr
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(strIP);
serv_addr.sin_port = htons(nPort);
int iTimeOut = 3000;
setsockopt(hSocket,SOL_SOCKET,SO_RCVTIMEO,(char*)&iTimeOut,sizeof(iTimeOut));
setsockopt(hSocket,SOL_SOCKET,SO_SNDTIMEO,(char*)&iTimeOut,sizeof(iTimeOut));
int error = -1;
int len = sizeof(int);
timeval tm;
fd_set set;
unsigned long ul = 1;
ioctlsocket(sockfd, FIONBIO, &ul); //设置为非阻塞模式
bool ret = false;
if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1)
{
tm.tv_sec = 3;
tm.tv_usec = 0;
FD_ZERO(&set);
FD_SET(sockfd, &set);
if( select(sockfd+1, NULL, &set, NULL, &tm) > 0)
{
getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (char *)&error, /*(socklen_t *)*/&len);
if(error == 0)
ret = true;
else
ret = false;
}
else
ret = false;
}
else
ret = true;
ul = 0;
ioctlsocket(sockfd, FIONBIO, &ul); //设置为阻塞模式
if(!ret)
{
closesocket( sockfd );
fprintf(stderr , "Cannot Connect the server!/n");
return;
}
fprintf( stderr , "Connected!/n");
char buff[] = "hello";
int sl=::send(sockfd,(char*)buff, sizeof(buff), 0);
char buffer[512] = {0};
int ret = recv(sockfd, buffer, sizeof(buffer), 0);
closesocket( sockfd );我的逻辑是这样的,设置接收和发送超时。考虑到connect在阻塞模式下,超时时间很长,设置为非阻塞模式,connect成功后,设回阻塞模式。但是测试情况来看,有大概20%的概率recv失败,有一部分错误码是10060(WSAETIMEDOUT 连接超时)。
这究竟是为什么?
...全文
相关推荐
Linux-socket编程指南
- **用途**:服务器程序用于接收客户端的连接,并创建新的套接字用于数据交互。#### 12. send()和recv()函数- **功能**: - `send()`:发送数据到已连接的套接字。
Socket-send-and-recv-.rar_c socket send recv_socket
发送数据可能不是立即完成的,因此开发者需要处理部分发送和非阻塞I/O的情况。6. **recv()函数**:对应于`send()`,`recv()`函数用于接收数据。
无阻塞Socket服务端、客户端示例
一旦连接成功,客户端也可以设置Socket为非阻塞模式,使用send()发送数据,recv()接收数据,同样需要处理可能的无数据可读或无法写入的情况。
Linux下多线程的阻塞模式下的socket编程
它通过connect()函数发起连接请求,然后进行数据的发送和接收。
DTU如何通过socket实现网络通信.pdf
- 连接(Connect)到服务器的指定IP地址和端口。 - 开始数据传输(Send/Receive)。 - 关闭Socket。


