网络编程的多路复用
mac下的kqueue的使用!!!
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/unistd.h>
#include<arpa/inet.h>
#include <netinet/in.h>
#include<string.h>
#include<stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/event.h>
#include <sys/time.h>
int terminate = 0 ;
static void sig_handler(int sig)
{
switch (sig)
{
case SIGINT:
printf("kill \n");
terminate = 1;
break;
default:
break;
}
}
int main(int argc , char * argv[])
{
if(argc != 3)
{
printf("输入有误\n");
return 0;
}
signal(SIGINT,sig_handler);
signal(SIGTERM,sig_handler);
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd == -1)
{
perror("socket error\n");
return 0;
}
int on =1 ;
setsockopt(sockfd,SOL_SOCKET,SO_RANDOMPORT,&on,sizeof(on));
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&saddr.sin_addr);
int r = bind(sockfd,(struct sockaddr *)&saddr , sizeof(saddr));
if(r==-1)
{
perror("bind error");
close(sockfd);
return 0;
}
r = listen(sockfd,3);
if(r==-1)
{
perror("listen error");
close(sockfd);
return 0;
}
int connfd;
struct sockaddr_in caddr;
int len = sizeof(caddr);
connfd = accept(sockfd,(struct sockaddr *)&caddr , &len);
if(connfd == -1)
{
perror("accept error");
close(sockfd);
return 0;
}
printf("ip地址为%s,端口号为%hu的客户端与我建立连接\n",inet_ntoa(caddr.sin_addr),caddr.sin_port);
char buf[50]="";
while(!terminate)
{
const static int FD_NUM = 2;
int kq = kqueue();
struct kevent changes[FD_NUM];
struct kevent events[FD_NUM];
int f1 = STDIN_FILENO;
int f2=connfd;
EV_SET(&changes[0], f1, EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, &f1);
EV_SET(&changes[1], f2, EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, &f2);
int nev = kevent(kq, changes, FD_NUM, events, FD_NUM, NULL);
for(int i=0; i<nev; i++){
struct kevent event = events[i];
int ready_fd = *((int *)event.udata);
if( ready_fd == f1 )
{
scanf("%s",buf);
printf("%s\n",buf);
}
else if( ready_fd == f2)
{
read(connfd,buf,50);
printf("%s\n",buf);
}
}
}
close(connfd);
close(sockfd);
return 0;
}
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/unistd.h>
#include<arpa/inet.h>
#include <netinet/in.h>
#include<string.h>
#include<stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
int main(int argc , char * argv[])
{
if(argc!= 3)
{
printf("输入有误\n");
return 0;
}
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd == -1)
{
perror("socket error\n");
return 0;
}
#if 0
struct sockaddr_in myaddr;
memset(&myaddr,0,sizeof(myaddr));
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(5555);
inet_aton("172.20.10.5",&myaddr.sin_addr);
bind(sockfd,(struct sockaddr *)&myaddr , sizeof(myaddr));
#endif
struct sockaddr_in addr;
memset(&addr , 0 , sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1], &addr.sin_addr);
int r = connect(sockfd,(struct sockaddr *)&addr,sizeof(addr));
if(r==-1)
{
perror("connect error");
close(sockfd);
return 0;
}
sleep(5);
char buf[]="hello";
write(sockfd, buf , sizeof(buf));
char buf1[100];
read(sockfd,buf1,100);
printf("%s\n",buf1);
close(sockfd);
return 0;
}
win下的poll使用
#include<stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <poll.h>
int main(int argc ,char *argv[])
{
if(argc != 3)
{
printf("输入有误\n");
return 0;
}
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd == -1)
{
perror("socket error");
return 0;
}
int on = 1;
setsockopt(sockfd,SOL_SOCKET,SO_REUSEPORT,&on,sizeof(on));
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&saddr.sin_addr);
int r = bind(sockfd,(struct sockaddr *)&saddr,sizeof(saddr));
if(r==-1)
{
perror("bind error");
close(sockfd);
return 0;
}
r = listen(sockfd,3);
if(r==-1)
{
perror("listen error");
close(sockfd);
return 0;
}
int connfd;
struct sockaddr_in caddr;
int len = sizeof(caddr);
connfd = accept(sockfd,(struct sockaddr*)&caddr,&len);
if(connfd == -1)
{
perror("accept error");
close(sockfd);
return 0;
}
printf("ip地址为%s,端口号为%hu的客户端与我建立了连接\n",inet_ntoa(caddr.sin_addr),
caddr.sin_port);
char buf[50] = "";
while(1)
{
struct pollfd fds[2];
fds[0].fd = connfd;
fds[0].events = POLLIN;
fds[1].fd = STDIN_FILENO;
fds[1].events = POLLIN;
int n = poll(fds,2,10000);
if(n<0)
{
perror("poll error");
break;
}
else if(n == 0)
{
printf("超时了\n");
}
else
{
if(POLLIN & fds[0].revents)
{
read(connfd,buf,50);
printf("%s\n",buf);
}
if(POLLIN & fds[1].revents)
{
scanf("%s",buf);
printf("%s\n",buf);
}
break;
}
}
char buf2[] = "bey";
write(connfd,buf2,strlen(buf2));
close(connfd);
close(sockfd);
return 0;
}
#include<stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
if(argc != 3)
{
printf("输入有误\n");
return 0;
}
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd == -1)
{
perror("socket error");
return 0;
}
int on = 1;
#if 0
struct sockaddr_in myaddr;
memset(&myaddr,0,sizeof(myaddr));
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(5555);
inet_aton("192.168.100.5",&myaddr.sin_addr);
bind(sockfd,(struct sockaddr*)&myaddr,sizeof(myaddr));
#endif
struct sockaddr_in addr;
memset(&addr,0,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&addr.sin_addr);
int r = connect(sockfd,(struct sockaddr*)&addr,sizeof(addr));
if(r == -1)
{
perror("connect error");
close(sockfd);
return 0;
}
sleep(5);
char buf[] = "hello";
write(sockfd,buf,strlen(buf));
char buf1[100];
read(sockfd,buf1,100);
printf("%s\n",buf1);
close(sockfd);
return 0;
}