基于socket的聊天室和简易ftp

聊天室:

                1.编写服务端收发客户端的信息(聊天室人数限制有server端连接数决定)。

                2.编写客户端记录登录用户名,发送本用户信息,接收其他用户信息。

                主要函数:socket,pthread

代码示例:

server

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <pthread.h>

int accid[5] = {0};
int i = 0;

void func(void *acid)
{
        char buf[255] = {'\0'};
        while(1)
        {
                int j,m;
                memset(buf,'\0',255);
                read(*((int *)acid),buf,255);
                for(j = 0;j < 5;j++)
                {
                        ;
                        if(accid[j] != *((int *)acid)   && accid[j] != 0)
                        {
                                write(accid[j],buf,255);
                        }
                }
        }
}

void *acc_buf(void *sockid)
{
        while(1)
        {
                accid[i] = accept(*((int *)sockid),NULL,NULL);
                pthread_t tid;
                pthread_create(&tid,NULL,(void *)func,(void *)&accid[i]);
                i++;
        }
        pthread_exit(NULL);
}


void result()
{
        int sockid;
        pthread_t acc;
        sockid = socket(AF_INET,SOCK_STREAM,0);
        struct sockaddr_in s_addr;
        s_addr.sin_family = AF_INET;
        s_addr.sin_port = htons(8000);
        inet_aton("192.168.200.199",&s_addr.sin_addr);
        bind(sockid,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
        listen(sockid,5);
        pthread_create(&acc,NULL,acc_buf,(void *)&sockid);
        pthread_join(acc,NULL);
}

int main()
{
        result();
        return 0;
}

client

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <pthread.h>

char name[20] = {'\0'};

void *send_buf(void *sockid)
{
        char buf[255] = {'\0'};
        char send_buf[300] = {'\0'};
        while(1)
        {
                memset(buf,'\0',255);
                memset(send_buf,'\0',300);
                fgets(buf,255,stdin);
                sprintf(send_buf,"%s >>> %s",name,buf);
                write(*((int *)sockid),send_buf,300);
        }
        pthread_exit(NULL);
}

void *get_buf(void *sockid)
{
        char read_buf[300] = {'\0'};
        while(1)
        {
                memset(read_buf,'\0',300);
                read(*((int *)sockid),read_buf,300);
                printf("%s",read_buf);
        }
        pthread_exit(NULL);
}

void result()
{
        int sockid;
        pthread_t send;
        pthread_t get;
        sockid = socket(AF_INET,SOCK_STREAM,0);
        struct sockaddr_in c_addr;
        c_addr.sin_family = AF_INET;
        c_addr.sin_port = htons(8000);
        inet_aton("192.168.200.199",&c_addr.sin_addr);
        connect(sockid,(struct sockaddr*)&c_addr,sizeof(struct sockaddr_in));
        sleep(3);
        pthread_create(&send,NULL,send_buf,(void *)&sockid);
        pthread_create(&get,NULL,get_buf,(void *)&sockid);
        pthread_join(send,NULL);
        pthread_join(get,NULL);
}

int main()
{
        printf("input your name :  ");
        scanf("%s",name);
        result();
        return 0;
}

结果示例:

bwn在abc与hjk聊天过程中加入

 简易ftp:

                1.编写服务端

                2.编写客户端连接服务端执行命令

                3.支持命令

                         cd:打开服务器文件夹

                         ls:查看服务器文件夹内容

                         mycd:打开客户端文件夹

                          myls:查看客户端文件内容

                         put:上传客户端文件到服务端

                         get:下载服务端文件到客户端

                主要应用函数:socket,strtok,opendir,chdir,readdir,getcwd

代码示例:

server

#include <sys/types.h>         
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#pragma pack(1)
struct sockaddr_in s_addr;
struct sockaddr_in a_addr;

void del_blank(char *n,char c)
{
        int i=0,j=0;
        while(n[i])
                {
                if(n[i]==c) i++;
                else n[j++]=n[i++];
        }
        n[j]='\0';
}

void deli_com(char str[],char command[],char argv[])
{
        if(strlen(str) != 0)
        {
        char* p = strtok(str, " ");
        sprintf(command,"%s",p);
        p = strtok(NULL," ");
        if(p != NULL)
        {
        sprintf(argv,"%s",p);
        }
        }
}
void scd(int a_id,char path[],char argv[])
{
                memset(path,0,50);
                sprintf(path,"%s",argv);
                del_blank(path,' ');
                del_blank(path,'\n');
                write(a_id,path,50);
}

void sls(char dir_name[],char context[],int a_id)
{
    DIR * dir;
    struct dirent * ptr;
    dir = opendir(dir_name);
    if(dir == NULL)
    {
        perror("why");
        exit(-1);
    }
    while((ptr = readdir(dir)) != NULL)
    {
        if(strcmp(ptr->d_name,".") == 0 || strcmp(ptr->d_name,"..") == 0)
        {
                continue;
        }
        strcat(context,ptr->d_name);
        strcat(context,"\n");
    }
    write(a_id,context,255);
        memset(context,0,255);
    closedir(dir);
}

void spwd(char dir_name[],int a_id)
{
        char get_path[50];
        chdir(dir_name);
        getcwd(get_path,50);
        write(a_id,get_path,50);
}

void sget(char path[],char argv[],int a_id,char *scontext)
{
        char r_path[50] = {0};
        int fd;
        int size;
        sprintf(r_path,"%s/%s",path,argv);
        del_blank(r_path,' ');
        del_blank(r_path,'\n');
        fd = open(r_path,O_RDWR);
        if(fd == -1)
        {
                printf("open file fail\n");
                perror("why");
                exit(-1);
        }
        size = lseek(fd,0,SEEK_END);
        scontext = (char *)malloc(size);
        lseek(fd,0,SEEK_SET);
        read(fd,scontext,size);
        close(fd);
        write(a_id,scontext,size);
        memset(scontext,0,size);
        free(scontext);
}

void sput(char path[],char argv[],int a_id,char *pcontext)
{
                        int fd;
                                                char f_path[50] = {0};
                        pcontext = (char *)malloc(1024);
                                                memset(pcontext,0,1024);
                        read(a_id,pcontext,1024);
                                                sprintf(f_path,"%s/%s",path,argv);
                                                del_blank(f_path,' ');
                                                del_blank(f_path,'\n');
                        fd = open(f_path,O_CREAT|O_RDWR,0777);
                                                lseek(fd,0,SEEK_SET);
                        write(fd,pcontext,1024);
                        close(fd);
                                                free(pcontext);
}

void init_command(char command[],char argv[],char path[],int a_id,char *scontext,char *pcontext,char context[])
{
        if(strcmp(command,"cd") == 0)
        {
                scd(a_id,path,argv);
        }
        else if(strcmp(command,"ls") == 10)
        {
                sls(path,context,a_id);
        }
        else if(strcmp(command,"pwd") == 10)
        {
                spwd(path,a_id);
        }
        else 
        {
                if(strcmp(command,"get") == 0)
                {
                        if(strlen(argv) != 0)
                        {
                                sget(path,argv,a_id,scontext);
                        }
                }
                else
                {
                        sput(path,argv,a_id,pcontext);
                }
        }
                memset(argv,0,50);
                memset(command,0,10);
}
void result(char s_ip[],char s_port[])
{
        int s_id;
        int a_id;
        int len;
        char *scontext = NULL;
        char *pcontext = NULL;
        char context[255]= {'\0'};
        char command[10] = {0};
        char argv[50] = {0}; 
        char r_buf[255] = {0};
        char path[50] = {0};
        s_id = socket(AF_INET,SOCK_STREAM,0);
        if(s_id == -1)
        {
                perror("why");
                exit(-1);
        }
        s_addr.sin_family = AF_INET;
        s_addr.sin_port = htons(*s_port);
        inet_aton(s_ip,&s_addr.sin_addr);
        bind(s_id,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
        listen(s_id,5);
        len = sizeof(struct sockaddr);
        a_id = accept(s_id,(struct sockaddr *)&a_addr,&len);
        getcwd(path,50);
        while(1)
        {
                read(a_id,r_buf,255);
                deli_com(r_buf,command,argv);
                init_command(command,argv,path,a_id,scontext,pcontext,context);
        }
}
int main(int argc,char **argv)
{
        if(argc != 3)
        {
                perror("why");
                exit(-1);
        }
        result(argv[1],argv[2]);
        return 0;
}

client

#include <sys/types.h>         
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
struct sockaddr_in s_addr;

void deli_com(char buf[],char command[],char argv[])
{
    char* p = strtok(buf, " ");
    sprintf(command,"%s",p);
    p = strtok(NULL," ");
    if(p != NULL)
    {
        sprintf(argv,"%s",p);
    }
    memset(buf,0,255);
}

void del_blank(char *p,char c)
{
        int i=0,j=0;
        while(p[i])
                {
                if(p[i]==c) i++;
                else p[j++]=p[i++];
        }
        p[j]='\0';
}

void myls(char dir_name[])
{
    DIR * dir;
    struct dirent * ptr = NULL;
    dir = opendir(dir_name);
    if(dir == NULL)
    {
        perror("why");
        exit(-1);
    }
    while((ptr = readdir(dir)) != NULL)
    {
        if(strcmp(ptr->d_name,".") == 0 || strcmp(ptr->d_name,"..") == 0)
        {
                continue;
        }
        printf("%s\n", ptr->d_name);
    }
    closedir(dir);
}

void mypwd(char dir_name[])
{
        char get_path[50] = {0};
        chdir(dir_name);
        getcwd(get_path,50);
        printf("%s\n",get_path);
        memset(get_path,0,50);
}

void sput(char path[],char argv[],char write_buf[],int s_id,char *pcontext)
{
        char r_path[50] = {0};
        int fd;
        int size;
                memset(r_path,0,50);
        sprintf(r_path,"%s/%s",path,argv);
        del_blank(r_path,' ');
        del_blank(r_path,'\n');
                write(s_id,write_buf,255);
        fd = open(r_path,O_RDWR);
                if(fd == -1)
                {
                        printf("file open fail");
                        perror("why");
                        exit(-1);
                }
        size = lseek(fd,0,SEEK_END);
        pcontext = (char *)malloc(size);
                lseek(fd,0,SEEK_SET);
        read(fd,pcontext,size);
        write(s_id,pcontext,size);
        close(fd);
                free(pcontext);
}

void sget(char path[],char argv[],char write_buf[],int s_id,char *scontext,char *rcontext)
{
                        int fd;
                        umask(0);
                        char f_path[50] = {0};
                        scontext = (char *)malloc(1024);
                        write(s_id,write_buf,1024);
                        read(s_id,scontext,1024);
                        rcontext = (char *)malloc(strlen(scontext));
                        strncpy(rcontext,scontext,strlen(scontext));
                        sprintf(f_path,"%s/%s",path,argv);
                        del_blank(f_path,' ');
                del_blank(f_path,'\n');
                        fd = open(f_path,O_CREAT|O_RDWR,0777);
                        if(fd == -1)
                        {
                                printf("create file fail\n");
                                perror("why");
                                exit(-1);
                        }
                        write(fd,rcontext,10);
                        close(fd);
                        memset(scontext,0,1024);
                        free(rcontext);
                        memset(rcontext,0,strlen(scontext));
                        free(scontext);
}

void init_command(char command[],char path[],char argv[],char write_buf[],int s_id,char *scontext,char *pcontext,char context[],char rcontext[])
{
        if(command[0] == 'm' && command[1] == 'y')
        {
                if(strcmp(command,"mycd") == 0)
                {
                        memset(path,0,50);
                        sprintf(path,"%s",argv);
                        del_blank(path,' ');
                        del_blank(path,'\n');
                }
                else if(strcmp(command,"myls") == 10)
                {
                        myls(path);
                }
                else
                {
                        mypwd(path);
                }
        }
        else 
        {
                if(strcmp(command,"get") == 0)
                {
                        sget(path,argv,write_buf,s_id,scontext,rcontext);
                }
                else if(strcmp(command,"put") == 0)
                {
                        sput(path,argv,write_buf,s_id,pcontext);
                }
                else
                {
                        write(s_id,write_buf,255);
                        read(s_id,context,255);
                        printf("%s\n",context);
                }
                memset(argv,0,50);
        memset(command,0,50);
                memset(write_buf,0,255);
                memset(context,0,255);
        }
}

void result(char s_ip[],char s_port[])
{
        int s_id;
        char buf[255] = {0};
        char bak[255] = {0};
        char *scontext = NULL;
        char *pcontext = NULL;
        char *rcontext = NULL;
        char context[255] = {0};
        char command[10] = {'\0'};
        char argv[50] = {0};
        char path[50] = {0};
        s_id = socket(AF_INET,SOCK_STREAM,0);
        if(s_id == -1)
        {
                perror("why");
                exit(-1);
        }
        s_addr.sin_family = AF_INET;
        s_addr.sin_port = htons(*s_port);
        inet_aton(s_ip,&s_addr.sin_addr);
        connect(s_id,(struct sockaddr *)&s_addr,sizeof(struct sockaddr));
        getcwd(path,50);
        while(1)
        {
                printf(">>>>");
                fgets(buf,255,stdin);
                sprintf(bak,"%s",buf);
                deli_com(buf,command,argv);
                printf("--------------------------------------------------------------\n");
                init_command(command,path,argv,bak,s_id,scontext,pcontext,context,rcontext);
                printf("--------------------------------------------------------------\n");
        }
}

int main(int argc,char **argv)
{
        if(argc != 3)
        {
                perror("why");
                exit(-1);
        }
        result(argv[1],argv[2]);
        return 0;
}

结果示例:

服务端

客户端

 文件传输结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值