您的位置:首页 > 运维架构 > Linux

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

2018-01-02 15:30 204 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: