【无标题】

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
#include<pthread.h>
#include<sys/wait.h>
#include<sys/socket.h>
#include<sys/select.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sqlite3.h>
#include<fcntl.h>
#include<sys/stat.h>
#define PORT 8081
#define BUFFSIZE 32
#define BUFFSIZE_LINE 128
// char *ip="192.168.108.210";
char *ip="192.168.1.11";
typedef struct{
    int client_socket;
    struct sockaddr_in client_addr;
}client_info_t;
void print_sockaddr(struct sockaddr_in addr){
    printf("[%s:%d]:\n",inet_ntoa(addr.sin_addr),ntohs(addr.sin_port));
}
void client_exit(struct sockaddr_in client_addr){
    print_sockaddr(client_addr);
}
void* handle_pthread(void *arg){
    client_info_t* client_info=(client_info_t*)arg;
    int client_socket=client_info->client_socket;
    struct sockaddr_in client_addr=client_info->client_addr;
    char send_buf[BUFFSIZE],recv_buf[BUFFSIZE];
    while(1){
        memset(send_buf,0,sizeof(send_buf));
        memset(recv_buf,0,sizeof(recv_buf));
        int val_recv=recv(client_socket,recv_buf,BUFFSIZE,0);
        if(val_recv==0){
            close(client_socket);
            client_exit(client_addr);
            pthread_exit(NULL);
        }
        print_sockaddr(client_addr);
        recv_buf[BUFFSIZE-1]='\0';
        printf("recv_buf=%s\n",recv_buf);
        sprintf(send_buf,"hello server has recv %d\n",client_socket);
        send_buf[strlen(send_buf)-1]='\0';
        send(client_socket,send_buf,sizeof(send_buf),0);
        printf("[send to %d]:%s\n",client_socket,send_buf);
    }
}
void print_err(char *arg){
    perror(arg);
    fprintf(stderr,"errno:%s\n",strerror(errno));
}
void print_db_err(char *arg,sqlite3 *ppDb){
    perror(arg);
    fprintf(stderr,"errno:errcode=%d,errmsg=%s\n",sqlite3_errcode(ppDb),sqlite3_errmsg(ppDb));
}
int handle_callback(void *data,int argc,char **argv,char **azColName){

    return 0;
}
int main(int argc, char const *argv[])
{
    /* code */
    char *errmsg=NULL;

    sqlite3 *ppDb_dict=NULL,*ppDb_user=NULL;
    if(sqlite3_open("./dict.db",&ppDb_dict)!=SQLITE_OK){
        print_db_err("sqlite3_open ./dict.db err\n",ppDb_dict);
        return -1;
    }
    char *sql_dict="create table if not exists dict(word char,mean char);";
    if(sqlite3_exec(ppDb_dict,sql_dict,NULL,NULL,&errmsg)!=SQLITE_OK){
        print_db_err("sqlite3_exec sql_dict err\n",ppDb_dict);
        sqlite3_free(errmsg);
        errmsg=NULL;
        return -1;
    }
    printf("sqlite3_exec sql_dict sucessful\n");


    FILE *fp=fopen("/home/ubuntu/Project/Socket/demo1/dict.txt","rb");
    if(fp==NULL){
        perror("open fail err\n");
        return -1;
    }
    char line[BUFFSIZE_LINE],word[BUFFSIZE],mean[BUFFSIZE*2],sql_line[BUFFSIZE*4]={0};
    while(fgets(line,sizeof(line),fp)!=NULL){
        // static int cnt=0;
        // cnt++;
        // if(cnt>5) break;
        line[strcspn(line,"\n")]=0;
        char *token=strtok(line," ");
        strcpy(word,token);
        token=strtok(NULL," ");
        strcpy(mean,token);
        sprintf(sql_line,"insert into dict values(\"%s\",\"%s\");",word,mean);
        if(sqlite3_exec(ppDb_dict,sql_line,NULL,NULL,&errmsg)){
            print_db_err("insert into dict err\n",ppDb_dict);
        }
        printf("%s %s\n",word,mean);
        memset(mean,0,sizeof(mean));
        memset(word,0,sizeof(word));
        memset(line,0,sizeof(line));
    }
    if(feof(fp)) printf("已到达文件结尾\n");
    else if(ferror(fp)) perror("读取错误\n");



    if(sqlite3_open("./user.db",&ppDb_user)!=SQLITE_OK){
        print_db_err("sqlite3_open ./user.db err",ppDb_user);
        return -1;
    }
    char *sql_user="create table if not exists history(name char, word char, mean char, stage int);"
                    "create table if not exists usr(name char primary key, passwd char, state int);";
    if(sqlite3_exec(ppDb_user,sql_user,NULL,NULL,&errmsg)!=SQLITE_OK){
        print_db_err("sqlite3_exec sql_user err\n",ppDb_user);
        sqlite3_free(errmsg);
        errmsg=NULL;
        return -1;
    }
    printf("sqlite3_exec sql_user sucessful\n");

    int server_socket,client_socket;
    struct sockaddr_in server_addr,client_addr;
    socklen_t server_len=sizeof(server_addr),client_len=sizeof(client_addr);

    if((server_socket=socket(AF_INET,SOCK_STREAM,0))==-1){
        print_err("socket err");
        exit(EXIT_FAILURE);
    }
    server_addr.sin_family=AF_INET;
    server_addr.sin_port=htons(PORT);
    server_addr.sin_addr.s_addr=inet_addr(ip);

    int opt=1;
    if(setsockopt(server_socket,SOCK_STREAM,SO_REUSEADDR,&opt,sizeof(opt))==-1){
        print_err("setsockopt err");
        exit(EXIT_FAILURE);
    }

    if(bind(server_socket,(struct sockaddr *)&server_addr,server_len)==-1){
        print_err("bind server_socket");
        exit(EXIT_FAILURE);
    }
    
    if(listen(server_socket,128)==-1){
        print_err("listen err");
        exit(EXIT_FAILURE);
    }
    printf("listening .... \n");
    while(1){
        client_socket=accept(server_socket,(struct sockaddr *)&client_addr,&client_len);
        if(client_socket==-1){
            print_err("accept err");
            sleep(2);
            continue;
        }
        printf("[%s:%d] is Connected...\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
        
        client_info_t client_info;
        client_info.client_socket=client_socket;
        client_info.client_addr=client_addr;
        pthread_t tid=-1;
        if((pthread_create(&tid,NULL,handle_pthread,&client_info))==-1){
            print_err("pthread_create");
            sleep(2);
            continue;
        }
        pthread_detach(tid);
    }
    close(server_socket);
    return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值