无界面 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; }
#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; }