基于TCP协议的多线程并发服务器实例代码

功能:客户端上传文件到服务器

//服务器代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
typedef struct con_info{
	int connfd;
	struct sockaddr_in* client_addr;
}CON_INFO;
void *conn_handle(void *argc){
	printf("new connection >>>>> from %s , connfd= %d \n",inet_ntoa(((CON_INFO *)argc)->client_addr->sin_addr),((CON_INFO *)argc)->connfd);
	char buf[512];
	memset(buf,0,sizeof(buf));
	while(1){
		int ret=read(((CON_INFO *)argc)->connfd,buf,sizeof(buf));
		int fp=open(buf,O_RDWR | O_CREAT,0775);
		while(1){
			ret=read(((CON_INFO *)argc)->connfd,buf,sizeof(buf));
			if(ret<=sizeof(buf)){
				write(fp,buf,ret);
				close(fp);
				printf("arrive end position!\n");
				memset(buf,-1,sizeof(buf));
				exit(-1);
				break;
			}
			write(fp,buf,ret);
		}
		printf("aceept file complete!\n");
		close(fp);
		memset(buf,0,sizeof(buf));
	}

}
int main(int argc,char *argv[])
{
	int sockfd=socket(AF_INET,SOCK_STREAM,0);
	if(sockfd<0){

		perror("socket");
		exit(-1);
	}
	printf("socker create successful\n");
	//绑定
	struct sockaddr_in server_addr;
	memset(&server_addr,0,sizeof(server_addr));
	server_addr.sin_family=AF_INET;
	server_addr.sin_addr.s_addr=inet_addr("192.168.12.57");
	server_addr.sin_port=htons(8080);
	if(bind(sockfd,(struct sockeaddr*)&server_addr,sizeof(server_addr))!=0){
		perror("bind");
		exit(-2);
	}
	printf("bind successful\n");
	//监听
	if(listen(sockfd,6)!=0){
		perror("listen");
		exit(-3);
	}
	printf("start listen, waitting connection...\n");
	//等待客户端链接
	pthread_t pt;
	while(1){
		struct sockaddr_in client_addr;
		int client_len=sizeof(client_addr);
		int connfd=accept(sockfd,(struct sockaddr *)&client_addr,&client_len);
		if(connfd<0){
			perror("accept");
			exit(-4);
		}
		printf("connection successful!\n");
		CON_INFO con_info;
		con_info.connfd=connfd;
		con_info.client_addr=((struct sockaddr_in *)&client_addr);
		pthread_create(&pt,NULL,conn_handle,&con_info);
		pthread_detach(pt);
	}
	return 0;
}
//客户端代码
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{
	int sockfd;
	struct sockaddr_in server_addr, client_addr;
	//创建套接字
	sockfd=socket(AF_INET,SOCK_STREAM,0);
	if(sockfd<0){
		perror("socket");
		exit(-1);
	}
	printf("create socket successful!\n");
	memset(&client_addr,0,sizeof(client_addr));
	client_addr.sin_family=AF_INET;
	client_addr.sin_addr.s_addr=inet_addr("192.168.12.57");
	client_addr.sin_port=htons(8080);
	//链接
	int client_len=sizeof(client_addr);
	int	con=connect(sockfd,(struct sockaddr *)&client_addr,client_len);
	if(con !=0){
		perror("connect");
		exit(-2);
	}
	//发送数据
	char buf[512];
	memset(buf,0,sizeof(buf));
	int ret=-1;
	while(1){
		printf("please enter a file name in current path: \n");
		fgets(buf,sizeof(buf),stdin);
		//strcpy(buf,"1.txt");
		buf[strlen(buf)-1]='\0';
		int fp=open(buf,O_RDONLY);
		write(sockfd,buf,strlen(buf));
		while((ret=read(fp,buf,sizeof(buf)))>0){
				printf("buf = %s\n");
				write(sockfd,buf,ret);	
	
		}
		memset(buf,0,sizeof(buf));
		close(fp);		
	}

	printf("send file successful!\n");
	return 0;
}