linux tcp多執行緒伺服器與客戶端程式設計例項
阿新 • • 發佈:2019-01-01
伺服器端:
#include<iostream> #include<arpa/inet.h> #include<sys/socket.h> #include<cstdlib> #include<cstdio> #include<pthread.h> using namespace std; void *run(void *arg); int main(void) { int fd=0,res=0; unsigned int port=8888; struct sockaddr_in my_addr; //init sockaddr_in //bzero(my_addr,sizeof(my_addr)); my_addr.sin_family=AF_INET; my_addr.sin_port=htons(port); my_addr.sin_addr.s_addr=htonl(INADDR_ANY); //1,create tcp socket fd=socket(AF_INET,SOCK_STREAM,0); if(fd<0) { perror("socket"); exit(-1); } cout<<"create socket success,fd:"<<fd<<endl; //2,bind sockfd with sockaddr res = bind(fd,(struct sockaddr *)&my_addr,sizeof(my_addr)); if(res!=0) { perror("bind"); close(fd); exit(-1); } cout<<"bind success."<<endl; //3,switch active to unactive res = listen(fd,10); if(res!=0) { perror("bind"); close(fd); exit(-1); } cout<<"listen success."<<endl; //4,waiting and accept client connect request... int client_fd=0; unsigned client_port=0; char client_ip[20]; pthread_t tid; sockaddr_in client_addr; socklen_t socklen = sizeof(client_addr); cout<<"server listenning at port "<<port<<endl; while(1) { client_fd = accept(fd,(struct sockaddr *)&client_addr,&socklen); if(client_fd<0) { perror("accept"); close(fd); exit(-1); } //get client ip and port inet_ntop(AF_INET,&client_addr.sin_addr.s_addr,client_ip,sizeof(client_ip)); client_port = ntohs(client_addr.sin_port); cout<<"client "<<client_ip<<":"<<client_port<<" connected,client fd:"<<client_fd<<endl; //create new thread handle client pthread_create(&tid,NULL,run,(void *)client_fd); pthread_detach(tid); } close(fd); return 0; } void *run(void *arg)//thread execute function { int client_fd = (int)arg; int len=0; char *buf[512]; while(1) { len = read(client_fd,buf,sizeof(buf));//read data from client if(len==0) { cout<<"client disconnected."<<endl; close(client_fd); break; } len = write(client_fd,buf,len);//echo to client } return NULL; }
客戶端:
#include<iostream> #include<arpa/inet.h> #include<sys/socket.h> #include<cstdlib> #include<cstdio> #include<cstring> using namespace std; int main(void) { int fd=0,res=0,len=0; unsigned int server_port = 8888; const char *server_ip = "192.168.1.19"; char sendbuf[512]="",getbuf[512]=""; struct sockaddr_in server; //init server sockaddr server.sin_family = AF_INET; server.sin_port = htons(server_port); inet_pton(AF_INET,server_ip,&server.sin_addr.s_addr); //create tcp socket fd = socket(AF_INET,SOCK_STREAM,0); if(fd<0) { perror("socket"); exit(-1); } cout<<"create socket success,fd:"<<fd<<endl; //connect to server... res = connect(fd,(struct sockaddr *)&server,sizeof(server)); if(res!=0) { perror("connect"); close(fd); exit(-1); } cout<<"connect to server success."<<endl; while(1) { cout<<">:"; cin.getline(sendbuf,sizeof(sendbuf)); send(fd,sendbuf,strlen(sendbuf),0);//send data to server len = recv(fd,getbuf,sizeof(getbuf),0);//receive data from server getbuf[len]='\0'; if(len==0) { cout<<"server disconnected"<<endl; close(fd); break; } cout<<"recv from server:"<<getbuf<<endl; } return 0; }