Linux下C语言编程,利用多线程实现socket套接字通讯传输文件

本文介绍在Linux环境下,使用C语言编程,通过多线程实现socket套接字进行文件的通讯传输。在Deepin 15.10上,使用GCC 7.3.0编译器,服务端和客户端程序分别负责不同的功能,用户可以执行ls列出文件、put上传文件、get下载文件或exit退出连接等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发环境: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(
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值