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