linux 客户端 Socket 非阻塞connect编程(源码)
linux 客户端 Socket 非阻塞connect编程(源码)
非阻塞connect完整代码综合如下:
int main(int argc, char** argv)
{
int sockfd, recvbytes,res,flags,error,n;
socklen_t len;
fd_set rset,wset;
struct timeval tval;
tval.tv_sec = 0;
tval.tv_usec = 300000;
struct sockaddr_in serv_addr;
char* sendData = "1234567890";//发送字符串
char buf[1024] = "\0"; //接收buffer
//创建socket描述符
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket create failed");
return 1;
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(9999);
serv_addr.sin_addr.s_addr = inet_addr("58.31.231.255");
bzero(&(serv_addr.sin_zero),8);
flags = fcntl(sockfd,F_GETFL,0);
fcntl(sockfd,F_SETFL,flags|O_NONBLOCK);//设置为非阻塞
if ( (res = connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) )< 0)
{
if(errno != EINPROGRESS)
{
return 1;
}
}
//如果server与client在同一主机上,有些环境socket设为非阻塞会返回 0
if(0 == res) goto done;
FD_ZERO(&rset);
FD_SET(sockfd,&rset);
wset = rset;
if( ( res = select(sockfd+1, NULL, &wset, NULL,&tval) ) <= 0)
{
perror("connect time out\n");
close(sockfd);
return 1;
}
else
{
len = sizeof(error);
getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len);
if (error)
{
fprintf(stderr, "Error in connection() %d - %s\n", error, strerror(error));
return 1;
}
}
done:
if ( (n = send(sockfd, sendData, strlen(sendData),0) ) ==-1 )
{
perror("send error!");
close(sockfd);
return 1;
}
if( ( n = select(sockfd+1,&rset,NULL, NULL,&tval)) <= 0 )//rset没有使用过,不用重新置为sockfd
{
perror("receive time out or connect error");
close(sockfd);
return -1;
}
if ((recvbytes=recv(sockfd, buf, 1024, 0)) ==-1)
{
perror("recv error!");
close(sockfd);
return 1;
}
printf("receive num %d\n",recvbytes);
printf("%s\n",buf);
}
分享到:
相关推荐
Linux 客户端 Socket 非阻塞 connect 编程收集 本文档主要讨论了 Linux 客户端 Socket 非阻塞 connect 编程的实现与应用,非阻塞 connect 编程的主要用途有三种: 1. 三次握手同时做其他的处理。在 connect 过程中...
总的来说,从源码层面理解Socket的阻塞与非阻塞,有助于深入掌握网络编程的工作原理。在高性能网络应用中,非阻塞模式常常被用来提高系统的并发性和响应性。通过内核中的函数调用和逻辑处理,我们可以看到操作系统...
- 使用NIO(非阻塞I/O)可以通过`java.nio`包提高Socket编程的效率,特别是对于高并发场景。 - 使用缓冲区(Buffer)进行数据读写,减少系统调用次数。 7. **SSL/TLS安全通信**: - 对于需要加密和身份验证的...
- 可能涉及的优化策略包括连接池管理、非阻塞I/O、复用套接字等。 通过深入研究“实战linux socket编程--示例源码.rar”,开发者不仅可以掌握Socket编程的基本技巧,还能了解到如何在实际项目中解决各种网络通信...
总之,"C++ TCP客户端非阻塞连接超时测试源码"是一个实用的示例,它展示了如何在C++中处理TCP连接的非阻塞和超时问题,这对于开发高可用性和高性能的网络应用程序至关重要。通过学习和分析这段代码,开发者可以提升...
同时,可能会有异步非阻塞I/O、多线程、套接字选项设置等高级特性。 通过研究和实践这些Socket编程经典例子,开发者可以更好地理解网络通信的本质,学会如何在C++中实现可靠的客户端-服务器通信,为构建分布式系统...
- 使用非阻塞I/O,`fcntl()`或`ioctl()`可以设置Socket为非阻塞模式。 - 库如libevent或libev提供了事件驱动的异步Socket编程框架,简化了编程复杂性。 5. **常见问题及解决办法**: - **连接超时**:设置合适的...
- 使用`BeginSend`/`EndSend`和`BeginReceive`/`EndReceive`异步方法处理数据传输,以实现非阻塞I/O。 - 错误处理和连接状态管理,如异常捕获和断开连接。 6. **调试与测试** Socket调试工具2.0源码提供了可视化...
这个名为"Linux高性能服务器编程源码.zip"的压缩包很可能是为了帮助开发者理解和实践这些概念,通过实际的源代码示例来学习。让我们深入探讨一下其中可能涉及的一些重要知识点。 1. **多线程与并发**:高性能服务器...
以及使用非阻塞模式提高并发处理能力。 源码分析时,重点要关注如何创建和管理Socket对象,如何进行文件的读写操作,以及如何处理网络通信中的各种异常情况。理解这些核心概念和源码逻辑,有助于你构建自己的文件...
11. **异步编程**:C++11引入了异步I/O模型,可以使用`std::async`、`std::future`和`std::promise`等工具实现非阻塞的套接字操作。 12. **套接字选项**:`setsockopt()`和`getsockopt()`函数可以设置和获取套接字...
7. **线程和异步操作**:为了实现非阻塞I/O和提高性能,FTPClient可能使用了异步操作或多线程。异步操作可以避免程序在等待数据传输时冻结,使得用户体验更佳。 8. **文件流操作**:在进行文件上传或下载时,需要...
《UNIX网络编程源码unpv13e》是学习UNIX系统下网络编程的重要参考资料,它包含了一整套的源代码示例,旨在帮助开发者深入理解socket编程、C/S(客户端/服务器)架构以及B/S(浏览器/服务器)架构。这份源码集由著名...
在Socket编程中,可能还会遇到如阻塞与非阻塞模式、套接字选项、多线程处理并发连接等高级话题,这些都是提升Socket编程能力的关键。 总的来说,这个"Socket源码Demo"是学习TCP/IP通信的一个良好起点,它涵盖了基本...
同时,为了提高效率,可以考虑使用非阻塞模式或者多路复用技术,如`socket_select()`或`stream_select()`。 通过以上步骤,你就可以使用PHP构建一个基本的Socket通信程序了。然而,实际项目中可能会涉及更复杂的...
4. **多线程或异步处理**:为了同时处理多个客户端连接,服务器可能使用多线程或多进程,或者非阻塞I/O模型如epoll。在"consvr"中,可能展示了如何通过`pthread_create()`创建线程来处理每个新连接。 5. **套接字...
为了提高效率,可以采用多线程或者非阻塞I/O(如NIO,Java的新I/O库)来改进。但是,对于初学者来说,理解单线程阻塞模型是学习网络编程的基础,有助于深入理解Socket通信的工作原理。 此外,源码分析可以帮助我们...
Java Socket 还提供了异步模式,即非阻塞 I/O。通过 `java.nio` 包中的 `SocketChannel` 和 `Selector`,我们可以实现多路复用,提高服务器处理并发连接的能力。 9. **SSL/TLS 安全通信** 对于安全通信,Java ...
除了基本的Socket操作,还可以使用选项如`setsockopt()`来调整Socket的行为,或者使用非阻塞模式、信号驱动I/O等高级特性。 总之,C++在Linux下的Socket编程涉及到网络通信的基础知识,包括Socket的创建、连接、...
一旦连接成功,客户端也可以设置Socket为非阻塞模式,使用send()发送数据,recv()接收数据,同样需要处理可能的无数据可读或无法写入的情况。 `SocketNB.sln`是Visual Studio的解决方案文件,包含了项目配置信息;`...