1、UDP编程
服务端:
#include<stdio.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <pthread.h>
#include <strings.h>
#define QUIT_STR "QUIT"
#define SERV_PORT 5001
#define SERV_IP_ADDR "192.168.238.128"
#define bufsize 1024int main()
{int fd =-1;//1.socketfd = socket(AF_INET,SOCK_DGRAM,0);if(fd ==-1){perror("socket\n");exit(1);}//2.addrint b_reuser=1;setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&b_reuser,sizeof(int));//3.bindstruct sockaddr_in sin;bzero(&sin,sizeof(sin));sin.sin_family = AF_INET;sin.sin_port = htons(SERV_PORT);sin.sin_addr.s_addr = htonl(INADDR_ANY);if(bind(fd,(struct sockaddr*)&sin,sizeof(sin))<0){perror("bind");exit(1);} char buf[bufsize];//4.recvfromstruct sockaddr_in cin;socklen_t addrlen=sizeof(cin);while(1){bzero(buf,bufsize);if(recvfrom(fd,buf,bufsize-1,0,(struct sockaddr*)&cin,&addrlen)<0){perror("recvfrom\n");continue;}char ipv4_addr[16];if(!inet_ntop(AF_INET,(void*)&cin.sin_addr,ipv4_addr,sizeof(cin))){perror("inet_ntop");exit(1);}printf("recvive from (%s,%d),data:%s\n",ipv4_addr,ntohs(cin.sin_port),buf);if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))){printf("cilent:(%s,%d)\n",ipv4_addr,ntohs(cin.sin_port));}}close(fd);return 0;
}
客户端
#include<stdio.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <pthread.h>
#include <strings.h>
#define QUIT_STR "QUIT"
#define SERV_PORT 5001
#define SERV_IP_ADDR "192.168.238.128"
#define bufsize 1024int main(int argc,char** argv)
{if(argc!=3){exit(1);}int port=-1;port=atoi(argv[2]);int fd =-1;//1.socketfd = socket(AF_INET,SOCK_DGRAM,0);if(fd ==-1){perror("socket\n");exit(1);}struct sockaddr_in sin;bzero(&sin,sizeof(sin));sin.sin_family = AF_INET;sin.sin_port = htons(port);sin.sin_addr.s_addr = inet_addr(argv[1]);char buf[bufsize];//sendwhile(1){bzero(buf,bufsize);if(fgets(buf,bufsize-1,stdin) == NULL){perror("fgets");continue;}sendto(fd,buf,bufsize-1,0,(struct sockaddr*)&sin,sizeof(sin));if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))){perror("strncasecmp");exit(1);}}close(fd);return 0;
}
运行结果:
2、IO多路复用
服务端:
#include<stdio.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <pthread.h>
#include <strings.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#define QUIT_STR "QUIT"
#define SERV_RESP_STR "SERVER:"
#define SERV_IP 5001
#define SERV_IP_ADDR "192.168.238.128"
#define bufsize 1024
void child_data_handle(int signum)
{if(SIGCHLD==signum){waitpid(-1,NULL,WNOHANG);}
}
void* cilent_data_handle(void* arg)
{int newfd=*(int *)arg;char respbuf[bufsize];char buf[bufsize];printf("child process handle:newfd = %d\n",newfd);int ret =-1;while(1){do{bzero(buf,bufsize);ret=read(newfd,buf,bufsize-1);}while(ret<1);if(ret<0){exit(1);}if(!ret){break;}printf("recive data is %s\n",buf);bzero(respbuf,bufsize-1);strncpy(respbuf,SERV_RESP_STR,strlen(SERV_RESP_STR));strcat(respbuf,buf);do{ret =write(newfd,respbuf,strlen(respbuf));}while(ret<0);if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))){printf("cilenr is exiting!\n");break;}}close(newfd);}
int main()
{int fd=-1;signal(SIGCHLD,child_data_handle);fd=socket(AF_INET,SOCK_STREAM,0);if(fd == -1){perror("socket");exit(1);}struct sockaddr_in sin;bzero(&sin,sizeof(sin));sin.sin_family=AF_INET;sin.sin_port = htons(SERV_IP);sin.sin_addr.s_addr = INADDR_ANY;
/* if(inet_pton(AF_INET,SERV_IP_ADDR,(void*)&sin.sin_addr.s_addr)!=1){perror("inet_pton");exit(1);}*///2.bindif(bind(fd,(struct sockaddr *)&sin,sizeof(sin))<0){perror("bind");exit(1); }//3.listenif(listen(fd,5)<0){perror("listen");exit(1);}//4.accepint newfd=-1;pthread_t tid;pid_t pid;struct sockaddr_in cin;socklen_t addrlen=sizeof(cin);while(1){newfd= accept(fd,(struct sockaddr*)&cin,&addrlen);if(newfd<0){perror("accept");exit(1);}pid = fork();if(pid<0){perror("fork");break;}if(pid == 0){char IPV4_addr[16];if(!inet_ntop(AF_INET,(void *)&cin.sin_addr,IPV4_addr,sizeof(cin))){perror("inet_ntop");exit(1);}printf("cilent:(%s,%d)is connect\n",IPV4_addr,ntohs(cin.sin_port));cilent_data_handle(&newfd);close(fd);}if(pid >0){close(newfd);}}//readreturn 0;
}
客户端:
#include<stdio.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <pthread.h>
#include <strings.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#define SERV_RESP_STR "SERVER:"
#define QUIT_STR "QUIT"
#define SERV_PORT 5001
#define SERV_IP_ADDR "192.168.238.128"
#define bufsize 1024int main(int argc,char** argv)
{if(argc!=3){exit(1);}int port=-1;port=atoi(argv[2]);int fd =-1;//1.socketfd = socket(AF_INET,SOCK_STREAM,0);if(fd ==-1){perror("socket\n");exit(1);}struct sockaddr_in sin;bzero(&sin,sizeof(sin));sin.sin_family = AF_INET;sin.sin_port = htons(port);sin.sin_addr.s_addr = inet_addr(argv[1]);if(connect(fd,(struct sockaddr*)&sin,sizeof(sin))<0){perror("connect");exit(1);}fd_set rset;int maxfd =-1;char buf[bufsize];int ret =-1;struct timeval tout;while(1){FD_ZERO(&rset);FD_SET(0,&rset);FD_SET(fd,&rset);maxfd = fd;tout.tv_sec = 5;tout.tv_usec = 0;select(maxfd+1,&rset,NULL,NULL,&tout);if(FD_ISSET(0,&rset)){bzero(buf,bufsize);do{ret = read(0,buf,bufsize-1);}while(ret<0);if(ret<0){perror("read");continue;}if(!ret){continue;}if(write(fd,buf,strlen(buf))<0){perror("write");continue;}if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))){printf("cilent is exited!\n");break;}}if(FD_ISSET(fd,&rset)){bzero(buf,bufsize);do{ret = read(fd,buf,bufsize-1);}while(ret<0);if(ret<0){perror("read");continue;}if(!ret){break;}printf("service said:%s\n",buf);if((strlen(buf)>strlen(SERV_RESP_STR)) && (!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR)))){printf("cilent is exited!\n");break;}}}/* char buf[bufsize];//sendwhile(1){bzero(buf,bufsize);if(fgets(buf,bufsize-1,stdin) == NULL){perror("fgets");continue;}sendto(fd,buf,bufsize-1,0,(struct sockaddr*)&sin,sizeof(sin));if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))){perror("strncasecmp");exit(1);}}*/close(fd);return 0;
}
运行结果: