无界面 socket通信模拟在线评测

来源:互联网 发布:淘宝上怎么购买呼死你 编辑:程序博客网 时间:2024/04/20 02:49

                                                                 无界面 socket通信模拟在线评测


       客户端向服务端发送一个.c文件  服务端编译并运行此文件并把结果或错误信息返回给客户端;


server.c

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<sys/types.h>#include<unistd.h>#include<sys/socket.h>#include<netinet/in.h>#include<errno.h>#define SERVER_PORT 8888#define LISTEN_QUEUE 20#define BUFFER_SIZE  5000int main(void){     FILE *F,*F1;     pid_t pid;     int fd[2];     int len;     char buffer[BUFFER_SIZE];     bzero(buffer,BUFFER_SIZE);     char buffer2[BUFFER_SIZE];     bzero(buffer2,BUFFER_SIZE);    //声明并初始化一个服务器端的socket地址结构     struct sockaddr_in server_addr;     //int server_socket_fd = socket(PF_INET,SOCK_STREAM,0);     bzero(&server_addr,sizeof(server_addr));     server_addr.sin_family = AF_INET;     server_addr.sin_addr.s_addr = htonl(INADDR_ANY);     server_addr.sin_port = htons(SERVER_PORT);     //创建socket  若成功 返回socket描述符     int server_socket_fd = socket(PF_INET,SOCK_STREAM,0);     if(server_socket_fd < 0){         perror("创建套接字失败:");         exit(1);     }     //绑定socket 和 socket地址结构     if(bind(server_socket_fd,(struct sockaddr*)&server_addr,sizeof(server_addr))){            perror("绑定失败:");            exit(1);     }     //socket 监听     if(-1 == (listen(server_socket_fd,LISTEN_QUEUE)))     {         perror("监听失败:");         exit(1);     }         //定义客户打端的socket地址结构        struct sockaddr_in client_addr;        socklen_t client_addr_length = sizeof(client_addr);    while(1){        int new_server_socket_fd = accept(server_socket_fd,(struct sockaddr*)&client_addr,&client_addr_length);        if(new_server_socket_fd < 0 ){            if(errno == EINTR){                continue;            }            else{            perror("接收失败:");            close(server_socket_fd);            exit(1);        }    }         pid = fork();        if(pid < 0){            perror("创建进程失败:");            close(new_server_socket_fd);            exit(1);        }else if(pid == 0){        while((len = recv(new_server_socket_fd,buffer,BUFFER_SIZE,0)) > 0){            F=fopen("luo.c","w+");           fwrite(buffer,sizeof(char),strlen(buffer),F);           fclose(F);           if((pipe(fd))<0){               perror("创建管道失败:");               exit(1);           }           close(2);           int result = dup2(fd[1],2);           if(result < 0){               perror("redirect stderr error:");               exit(1);           }           system("gcc -o luo luo.c");           if(access("luo",F_OK)){               printf("编译失败,返回错误信息\n");               read(fd[0],buffer2,BUFFER_SIZE);           }else{           F1 = popen("./luo","r");           fread(buffer2,sizeof(char),BUFFER_SIZE,F1);           printf("编译成功\n");           pclose(F1);           system("rm luo");           }           printf("%s\n",buffer2);           send(new_server_socket_fd,buffer2,strlen(buffer2),0);          close(fd[1]);          close(fd[0]);           bzero(buffer,BUFFER_SIZE);           bzero(buffer2,BUFFER_SIZE);        }        bzero(buffer,BUFFER_SIZE);        bzero(buffer2,BUFFER_SIZE);        close(server_socket_fd);        _exit(0);            }else{           close(new_server_socket_fd);        }       }        return 0;}


client.c

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<netinet/in.h>#include<sys/types.h>#include<sys/socket.h>#include<unistd.h>#define SERVER_PORT 8888#define BUFFER_SIZE 10000int main(){    FILE *F;    struct sockaddr_in client_addr;    bzero(&client_addr,sizeof(client_addr));    client_addr.sin_family = AF_INET;    client_addr.sin_addr.s_addr = htonl(INADDR_ANY);    client_addr.sin_port = htons(SERVER_PORT);    int client_socket_fd = socket(AF_INET,SOCK_STREAM,0);    if(client_socket_fd < 0){        perror("创建套接字失败:");        exit(1);    }    if((connect(client_socket_fd,(struct sockaddr*)&client_addr,sizeof(client_addr))) == -1){        perror("连接失败:");        close(client_socket_fd);        exit(1);    }    char buffer[BUFFER_SIZE];    char buffer1[20];    int return_len;    while(1){    bzero(buffer,BUFFER_SIZE);    bzero(buffer,20);    printf("请输入要运行的程序:");    scanf("%s",buffer1);    F = fopen(buffer1,"r");    fread(buffer,sizeof(char),10000,F);    return_len = send(client_socket_fd,buffer,strlen(buffer),0);    if(return_len <= 0){        perror("发送失败:");        exit(1);    }    char buffer1[BUFFER_SIZE];    bzero(buffer1,BUFFER_SIZE);    recv(client_socket_fd,buffer1,1024,0);    printf("结果为:%s\n",buffer1);    fclose(F);    }    close(client_socket_fd);    return 0;}
运行截图:






1.c 文件内容:

#include<stdio.h>int main(){    printf("我是***!\n");    return 0;}

2.c 文件内容:

#include<stdio.h>int main(){    printf("错误\n")        return 0;}



原创粉丝点击