LinuxC之socket通信实现简单的在线评测
2018-01-02 15:30
204 查看
LinuxC之socket通信实现简单的在线评测
这里的在线评测是指客户端将一个文件的内容写入到一个字符传中,传给服务器端,服务器端接收此字符串,将为其创建一个新文件并将其写入,再进行编译,如果生成了可执行文件,那么将程序的运行结果返回给客户端,反之将错误信息返回给客户端
服务器端代码:
客户端代码:
测试程序1.c:
#include<stdio.h>
int main()
printf("hello world!");
return 0;
}
这里的在线评测是指客户端将一个文件的内容写入到一个字符传中,传给服务器端,服务器端接收此字符串,将为其创建一个新文件并将其写入,再进行编译,如果生成了可执行文件,那么将程序的运行结果返回给客户端,反之将错误信息返回给客户端
服务器端代码:
#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;
}
相关文章推荐
- LinuxC之socket通信实现简单的计算器
- Java中利用socket实现简单的服务端与客户端的通信(入门级)
- 【转】 C++ 简单的 Tcp 实现[socket] 客户端与客户端通信
- socket 实例实现简单通信
- 利用Tcp和socket实现的客户端与服务端的简单通信
- Java中利用socket实现简单的服务端与客户端的通信(中级)——实现任意双向通信
- Linux C UDP Socket实现客户与服务器简单通信
- 基于socket简单通信协议实现
- Android实现socket简单通信
- Android笔记——Socket通信实现简单聊天室
- Java用socket实现简单的一对一通信
- linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)
- [20180313智慧餐厅推荐系统02]基于python的socket编程代码,实现PC与服务器的简单通信
- Android笔记——Socket通信实现简单聊天室
- 基于socket简单通信协议实现(c/c++)
- socket编程实现一个简单的多人通信(udp)
- Android笔记——Socket通信实现简单聊天室
- Android简单实现Socket通信,client连接server后,server向client发送文字数据
- Python的socket网络编程1 sock简单通信实现
- Python socket实现的简单通信功能示例