我在云服务器上运行了一个socket。
本地运行时,从浏览器访问,会返回一个html。
但是在云服务器上,就一直没有数据返回,不知道什么原因。
这是源码,不知道有没有大佬看看。
程序运行用sudo ./a.out
浏览器http://ip:80/?**w1234**
就是向本地文件夹写入一个1234的串,并给浏览器返回一个submit success字符串,挂在云服务器上就一直没有返回。
#include <unistd.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 4096
// write
char line[MAXLINE];
char sendline[MAXLINE];
void getTime(char *dat,char *tim){
time_t tick = time(NULL);
struct tm *t = localtime(&tick);
strftime(dat,15,"%Y%m%d",t);
strftime(tim,7,"%H%M%S",t);
}
void responseHeader(int fd){
bzero(sendline,sizeof(sendline));
strcat(sendline,"HTTP/1.1 200 OK\r\n");
strcat(sendline,"Server: mtl6906\r\n");
strcat(sendline,"Date: ");
time_t tick = time(NULL);
strcat(sendline,ctime(&tick));
strcat(sendline,"Content-Type: text/html\r\n");
strcat(sendline,"Content-Length: ");
write(fd,sendline,strlen(sendline));
}
void doWrite(int fd, char *msg){
char filename[15],cur[7];
getTime(filename,cur);
FILE *fp = fopen(filename,"a+");
fprintf(fp,"%s %s\n",cur,msg);
responseHeader(fd);
char ps[] = "submit success!\n";
char sz[10] = {0};
snprintf(sz,sizeof(sz),"%ld\r\n\r\n",strlen(ps));
if(write(fd,sz,strlen(sz)) < 0){
printf("write error\n");
exit(1);
}
fclose(fp);
}
// read
void doRead(int fd, char *msg){
FILE *fp = fopen(msg,"r");
responseHeader(fd);
int len = read(fileno(fp),line,MAXLINE);
char sz[10] = {0};
snprintf(sz,sizeof(sz),"%d\r\n\r\n",len);
write(fd,sz,strlen(sz));
write(fd,line,len);
}
int main(){
int fd = socket(AF_INET,SOCK_STREAM,0);
if(fd < 0)
{
printf("socket error\n");
exit(1);
}
else
printf("create socket...\n");
sockaddr_in servaddr;
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8080);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(fd,(struct sockaddr *)&servaddr,sizeof(servaddr)) < 0){
printf("bind error\n");
exit(1);
}
else
printf("binding...\n");
if(listen(fd,100) < 0){
printf("listen error\n");
exit(1);
}
else
printf("listening...\n");
int connfd;
char line[MAXLINE];
char str[100];
time_t ticks;
int len,i,j;
for(;;){
if((connfd = accept(fd,(struct sockaddr*)NULL,NULL)) < 0){
printf("accept error....\n");
exit(1);
}
else
printf("accepting...\n");
// recive msg
read(connfd,line,100);
// character handle
len = strlen(line);
for(i=0;i<len;i++)
if(line[i] == '*' && line[i+1] == '*' ){
i+=2;
break;
}
char op = line[i++];
for(j=0;j<len;j++){
if(line[i+j] == '*'&&line[i+j+1]=='*')
break;
str[j] = line[i+j];
}
str[j] = 0;
// chooese service
switch(op){
case 'w':
doWrite(connfd,str);
break;
case 'r':
doRead(connfd,str);
break;
default:
break;
}
// recover source
close(connfd);
}
}
相似问题