开发环境:deepin 15.10桌面版,GCC版本7.3.0
代码:
服务端:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <dirent.h>
#include <fcntl.h>
#include <pthread.h>
#include <netdb.h>
#define true 1
#define false 0
#define MAXSIZE 2048
#define NAMELENTH 20
#define PORT 2999
#define BACKLOG 8
#define MAXTHREAD 8
struct info
{
pthread_t thread_id;//当前线程id
int index;//当前clients数组下表
int connectfd; //当前连接套接字
};
unsigned int thread_num=0;//用于记录线程数量,当thread_num==MAXTHREAD就应该让新接入的客户端等待了。
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; //线程互斥锁初始化,不确定可用。
struct info clients[MAXTHREAD]={
0};//保存客户端信息的数组,线程函数中会传入下标,在线程函数中应该使用传入的cur_index而不是thread_num
int useable[MAXTHREAD];//记录可用的clients下标,创建线程之后将相应下标置0,在线程执行完毕之后应将相应的下标置1;
void* client_in(void* cur_index); //线程函数,参数为当前的线程下标,用于不同线程间的区分。
void take_order(char* cmd,int cur_index);//执行具体命令,为了方便操作,且因为线程间问题,在执行文件传输中直接对cliens下标进行操作
void send_msg(const char* msg,int index);//发送消息
void send_dir(int index);//发送当前目录内容
void recive_msg(int index);//接收消息
void recive_cmd(char* cmd_buf,int index);//接收命令
int recive_choice(int index);//接收选择
void send_file(char* filename,int index);//发送文件
void recive_file(char* filename,int index);//接收文件
int main()
{
memset(useable,1,sizeof(useable));
struct sockaddr_in saddr;
int listenfd=socket(AF_INET,SOCK_STREAM,0);
if(listenfd<0)
{
perror("socket");
exit(-1);
}
int opt=SO_REUSEADDR;
memset(&saddr,0,sizeof(saddr));
saddr.sin_addr.s_addr=htons(INADDR_ANY);
saddr.sin_family=AF_INET;
saddr.sin_port=htons(PORT);
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
if(bind(listenfd,(struct sockaddr*)&saddr,sizeof(struct sockaddr_in))<0)
{
perror("bind");
exit(-1);
}
if((listen(listenfd,BACKLOG))<0)
{
perror("listen");
exit(-1);
}
printf("------------------------------------------------\n");
printf(" |server started, waiting for clients conncet|\n");
printf("------------------------------------------------\n");
while(1)
{
struct sockaddr_in caddr;
memset(&caddr,0,sizeof(caddr));
int n= sizeof(caddr);
int fd=accept(listenfd,(struct sockaddr*)&caddr,&n);
if(fd<0)
{
perror(