1. 程式人生 > >linux tcp多執行緒伺服器與客戶端程式設計例項

linux tcp多執行緒伺服器與客戶端程式設計例項

伺服器端:

#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;
}