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

开发环境: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
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
流式套接字是一种在网络编程中常用的通信机制。在C语言中,可以利用Socket库来实现流式套接字通信实现流式套接字通信的大致步骤如下: 1. 创建套接字:使用socket()函数创建一个套接字,指定协议族(比如AF_INET表示IPv4协议)、套接字类型(比如SOCK_STREAM表示流式套接字)以及具体的传输协议。 2. 绑定地址和端口:使用bind()函数将套接字绑定到一个特定的IP地址和端口上,以便于其他主机与该套接字通信。 3. 监听连接请求(服务器端):如果是服务器端的流式套接字,需要使用listen()函数开始监听连接请求,等待客户端的连接。 4. 接受连接(服务器端):使用accept()函数接受客户端的连接请求,并创建一个新的套接字与客户端进行通信。 5. 连接到服务器(客户端):如果是客户端,可以使用connect()函数连接到服务器端的流式套接字。 6. 发送和接收数据:使用send()和recv()函数来发送和接收数据。对于服务器端和客户端,可以通过这两个函数进行双向通信。 7. 关闭连接:使用close()函数关闭套接字连接,释放资源。 通过以上步骤,就可以使用C语言实现流式套接字通信。在实际编程中,还需要注意处理错误和异常情况,以及考虑通信的数据格式、协议和安全性等问题。除此之外,还可以结合多线程或多进程等技术,实现更复杂的网络应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值