基于linux的网络高级编程

来源:本站
导读:目前正在解读《基于linux的网络高级编程》的相关信息,《基于linux的网络高级编程》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《基于linux的网络高级编程》的详细说明。
简介:基于linux的网络高级编程

上面介绍了Linux的基础编程,下面在介绍Linux的网络高级编程。 由于在前面介绍的函数如connet、recv、send都是阻塞性函数,若资源没有准备好,则调用该函数的进程将进入休眠状态,这样无法实现I/O多路复用了,下面介绍两种I/O多路复用的解决方案。 1、fcntl函数实现(非阻塞方式) 实例fcntl.c #include <sys/types.h> #include <sys/socket.h> #include <sys/wait.h> #include #include #include #include #include <sys/un.h> #include <sys/time.h> #include <sys/ioctl.h> #include #include <netinet/in.h> #include #include #define SERVPORT 3333 #define BACKLOG 10 #define MAX_CONNECTED_NO 10 #define MAXDATASIZE 100 int main() { struct sockaddr_in server_sockaddr,client_sockaddr; int sin_size,recvbytes,flags; int sockfd,client_fd; char buf[MAXDATASIZE]; if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1){ perror("socket"); exit(1); } printf("socket success!,sockfd=%dn",sockfd); server_sockaddr.sin_family=AF_INET; server_sockaddr.sin_port=htons(SERVPORT); server_sockaddr.sin_addr.s_addr=INADDR_ANY; bzero(&(server_sockaddr.sin_zero),8); if(bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr))==-1){ perror("bind"); exit(1); } printf("bind success!n"); if(listen(sockfd,BACKLOG)==-1){ perror("listen"); exit(1); } printf("listening....n"); if((flags=fcntl( sockfd, F_SETFL, 0))<0) perror("fcntl F_SETFL"); flags |= O_NONBLOCK; if(fcntl( sockfd, F_SETFL,flags)<0) perror("fcntl"); while(1){ sin_size=sizeof(struct sockaddr_in); if((client_fd=accept(sockfd,(struct sockaddr*)&client_sockaddr,&sin_size))==-1){ perror("accept"); exit(1); } if((recvbytes=recv(client_fd,buf,MAXDATASIZE,0))==-1){ perror("recv"); exit(1); } if(read(client_fd,buf,MAXDATASIZE)<0){ perror("read"); exit(1); } printf("received a connection :%s",buf); close(client_fd); exit(1); }/*while*/ } 2、select函数实现 实例select_socket.c #include <sys/types.h> #include <sys/socket.h> #include <sys/wait.h> #include #include #include #include #include <sys/un.h> #include <sys/time.h> #include <sys/ioctl.h> #include #include <netinet/in.h> #define SERVPORT 3333 #define BACKLOG 10 #define MAX_CONNECTED_NO 10 #define MAXDATASIZE 100 int main() { struct sockaddr_in server_sockaddr,client_sockaddr; int sin_size,recvbytes; fd_set readfd; fd_set writefd; int sockfd,client_fd; char buf[MAXDATASIZE]; if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1){ perror("socket"); exit(1); } printf("socket success!,sockfd=%dn",sockfd); server_sockaddr.sin_family=AF_INET; server_sockaddr.sin_port=htons(SERVPORT); server_sockaddr.sin_addr.s_addr=INADDR_ANY; bzero(&(server_sockaddr.sin_zero),8); if(bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr))==-1){ perror("bind"); exit(1); } printf("bind success!n"); if(listen(sockfd,BACKLOG)==-1){ perror("listen"); exit(1); } printf("listening....n"); FD_ZERO(&readfd); FD_SET(sockfd,&readfd); while(1){ sin_size=sizeof(struct sockaddr_in); if(select(MAX_CONNECTED_NO,&readfd,NULL,NULL,(struct timeval *)0)>0){ if(FD_ISSET(sockfd,&readfd)>0){ if((client_fd=accept(sockfd,(struct sockaddr *)&client_sockaddr,&sin_size))==-1){ perror("accept"); exit(1); } if((recvbytes=recv(client_fd,buf,MAXDATASIZE,0))==-1){ perror("recv"); exit(1); } if(read(client_fd,buf,MAXDATASIZE)<0){ perror("read"); exit(1); } printf("received a connection :%s",buf); }/*if*/ close(client_fd); }/*select*/ }/*while*/ } 对这2个例程掌握了,对以后的编程就会如虎添翼。

提醒:《基于linux的网络高级编程》最后刷新时间 2024-03-14 01:22:56,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《基于linux的网络高级编程》该内容的真实性请自行鉴别。