c语言 socket 非阻塞,C语言Socket入门非阻塞socket(connect timieout问题)

本文通过一个C语言示例程序展示了如何使用非阻塞Socket进行连接,并处理连接超时问题。程序中,connect函数在目标IP不存在或未监听指定端口时,会等待指定时间(如10秒)后返回错误。通过select和getsockopt函数可以检查连接状态,如连接成功、连接被拒绝、超时等。此外,还讨论了连接过程中TCP的三次握手和连接失败时的情况。
摘要由CSDN通过智能技术生成

如果客户端想连接一个服务器端,但是不能肯定服务器端是否存在,如果存在了是否能连上,怎么判断呢?

connect函数的默认行为是阻塞的,会一直等待在那里。为了判断各种情况,以及遇到错误时结束连接,我们需要使用非阻塞的socket。一个例子程序:

#include

#include

#include

#include

#include

#include

#include

#include

int main(void){

int s,r,ret,len,error;

char buf[20];

struct sockaddr_in sock;

fd_set rset,wset;

struct timeval tv;

tv.tv_sec=10;

s=socket(AF_INET,SOCK_STREAM,0);

if(-1==s){ printf("socket() failed/n"); return 1;

}

if(0>fcntl(s,F_SETFL,fcntl(s,F_GETFL,0)|O_NONBLOCK)){

printf("fcntl failed/n");

return 1; }

sock.sin_family=PF_INET;

sock.sin_port =htons(10080);

sock.sin_addr.s_addr=inet_addr("197.0.0.9");

if(-1==(ret

最新版Socket编程,后面带有程序实例,并通过调试,可以直接编译运行;希望对大家有帮助。代码设计服务端、客户端socket实例,设计IPV4、IPV6的实例代码。 网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。 部分代码(服务器): #include #include #include #include #include #include #include #include #define SERVPORT 3333 /*服务器监听端口号 */ #define BACKLOG 10 /* 最大同时连接请求数 */ main() { int sockfd,client_fd; /*sockfd:监听socket;client_fd:数据传输socket */ struct sockaddr_in my_addr; /* 本机地址信息 */ struct sockaddr_in remote_addr; /* 客户端地址信息 */ if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror( "socket创建出错!"); exit(1); } my_addr.sin_family=AF_INET; my_addr.sin_port=htons(SERVPORT); my_addr.sin_addr.s_addr = INADDR_ANY; bzero( &(my_addr.sin_zero),8); if (bind(sockfd, (struct sockaddr *) &my;_addr, sizeof(struct sockaddr)) == -1) { perror( "bind出错!"); exit(1); } if (listen(sockfd, BACKLOG) == -1) { perror( "listen出错!"); exit(1); } while(1) { sin_size = sizeof(struct sockaddr_in); if ((client_fd = accept(sockfd, (struct sockaddr *) &remote;_addr, &sin;_size)) == -1) { perror( "accept出错"); continue; } printf( "received a connection from %s\n", inet_ntoa(remote_addr.sin_addr)); if (!fork()) { /* 子进程代码段 */ if (send(client_fd, "Hello, you are connected!\n", 26, 0) == -1) perror( "send出错!"); close(client_fd); exit(0); } close(client_fd); } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值