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

                                                                 无界面 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  5000

int 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 10000

int 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;
}



猜你喜欢

转载自blog.csdn.net/fly_sky_share/article/details/78869144