LinuxC之socket通信实现简单的在线评测

LinuxC之socket通信实现简单的在线评测

这里的在线评测是指客户端将一个文件的内容写入到一个字符传中,传给服务器端,服务器端接收此字符串,将为其创建一个新文件并将其写入,再进行编译,如果生成了可执行文件,那么将程序的运行结果返回给客户端,反之将错误信息返回给客户端

服务器端代码:

#include<strings.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/ioctl.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>

int main(int argc,char *argv[])
{
    int server_fd,client_fd;
    int slen;
    socklen_t clen;
    FILE *fp;
    struct sockaddr_in saddrs;
    struct sockaddr_in caddrs;
    saddrs.sin_family=AF_INET;
    server_fd=socket(AF_INET,SOCK_STREAM,0);
    saddrs.sin_addr.s_addr=inet_addr("127.0.0.1");
    saddrs.sin_port=2936;
    slen=sizeof(saddrs);
    if((bind(server_fd,(struct sockaddr *)&saddrs,slen))==-1)
    {
        perror("fail to bind");
        exit(1);
    }
    if((listen(server_fd,1000))==-1)
    {
        perror("fail to listen");
        exit(1);
    }
    printf("waiting ......\n");
  client_fd=accept(server_fd,(struct sockaddr *)&caddrs,(socklen_t *)&clen);
        if(client_fd<0)
        {
            perror("fail to accept");
            exit(1);
        }
        while(1)
       {
        int n;
        char buffer[10000];
        if((n=recv(client_fd,buffer,sizeof(buffer),0))==-1)
        {
            perror("fail to recv");
            exit(1);
        }
        char num[10000];
        memset(num,0,10000);
        FILE *f;
        f=fopen("11.c","w");
        fwrite(buffer,sizeof(char),strlen(buffer),f);
        fclose(f);
       int pipes[2];
       int rwe=pipe(pipes);
       if(rwe<0)
       {
           perror("fail to pipe");
           exit(-1);
       }
       pid_t pgcc=fork();
       if(pgcc<0)
       {
           perror("fail to fork");
           exit(-1);
       }
       else if(pgcc==0)
       {
           close(pipes[0]);
           close(1);
           close(2);
           rwe=dup2(pipes[1],1);
           if(rwe<0)
           {
               perror("fail to redirect error");
               exit(-1);
           }
           rwe=dup2(pipes[1],2);
           if(rwe<1)
           {
               perror("fail to redirect error");
               exit(-1);
           }
           char cmd[1024];
           sprintf(cmd, "%s %s", "/usr/bin/gcc -O0 -g -o a.out", "11.c");
           system(cmd);
           exit(0);
       }
       close(pipes[1]);
       char result[10000];
       memset(result,0,strlen(result));
       read(pipes[0],result,10000);
       if(access("a.out",F_OK)==-1)
     {
       int m;
       if((m=send(client_fd,result,strlen(result),0))==-1)
       {
           perror("fail to send");
           exit(1);
       }
     }
     else
     {
         char result[10000];
         memset(result,0,sizeof(result));
         int pipes[2];
         int rwe=pipe(pipes);
         if(rwe<0)
         {
             perror("fail to pipe");
             exit(-1);
         }
         pid_t pgcc=fork();
         if(pgcc<0)
         {
             perror("fail to fork");
             exit(-1);
         }
         else if(pgcc==0)
         {
             close(pipes[0]);
             close(1);
             close(2);
             rwe=dup2(pipes[1],1);
             if(rwe<0)
             {
                 perror("fail to redirect");
                 exit(-1);
             }
             rwe=dup2(pipes[1],2);
             if(rwe<1)
             {
                 perror("fail to redirect");
                 exit(-1);
             }
             char cmd[1024];
             sprintf(cmd,"%s","./a.out");
             system(cmd);
             exit(0);
         }
         close(pipes[1]);
         memset(result,0,strlen(result));
         read(pipes[0],result,10000);
        int m;
        if((m=send(client_fd,result,strlen(result),0))==-1)
        {
            perror("fail to send");
            exit(-1);
        }
       }
     }
       close(client_fd);
    close(server_fd);
}

客户端代码:

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<unistd.h>
#include<netinet/in.h>
#include<string.h>
#include<arpa/inet.h>
#include<sys/stat.h>

int main(int argc,char *argv[])
{
    int sock_fd;
    int len,i;
    struct sockaddr_in addrs;
    if((sock_fd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {
        perror("fail to socket");
        exit(1);
    }
    addrs.sin_family=AF_INET;
    addrs.sin_addr.s_addr=inet_addr("127.0.0.1");
    addrs.sin_port=2936;
    len=sizeof(addrs);
   if((i=connect(sock_fd,(struct sockaddr *)&addrs,len))==-1)
    {
        perror("fail to connect");
       exit(1);
    }
    FILE *fp;
    char buffer[10000];
    bzero(buffer,10000);
    fp=fopen("1.c","r");
    fread(buffer,sizeof(char),10000,fp);
    fclose(fp);
    int byte,m;
    char result[1024];
    bzero(result,1024);
    if((byte=send(sock_fd,buffer,strlen(buffer),0))==-1)
    {
        perror("fail to send");
        exit(1);
    }
    if((m=recv(sock_fd,result,1024,0))==-1)
    {
        perror("fail to recv");
        exit(1);
    }
    printf("服务器端返回>>:%s\n",result);
    close(sock_fd);
    exit(0);
}


测试程序1.c:

#include<stdio.h>
int main()

    printf("hello world!");
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值