查看文章 |
socket 1
2009-11-01 22:20
//start #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <signal.h> #include <sys/socket.h> #include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <netinet/in.h> const int SIZE = 500; static void sigCancle(int); void usage(); void server(int ); int ser; void init(); char buff[SIZE]; int flen=0; int main(int argc,char ** argv){ if (argc!=2){ usage(); return 1; } if (signal(SIGINT,sigCancle)==SIG_ERR){ printf("signal Cancle error\n"); return 2; } init(); int port; sscanf(argv[1],"%d",&port); printf("start server at port: %d\n",port); ser=-1; server(port); return 0; } void init(){ int fin; if ((fin=open("index.html",O_RDONLY))<0){ printf("read file error\n"); exit(4); } struct stat sta ; if (fstat(fin,&sta)<0){ printf("read file stat error\n"); exit(5); } flen = sta.st_size; //printf("file size: %d\n",flen); void *src = mmap(0,flen,PROT_READ,MAP_SHARED,fin,0); if (src==MAP_FAILED){ printf("memery maping error\n"); exit(6); } memcpy(buff,src,flen); buff[flen]='\0'; //printf("%s\n",buff); munmap(src,flen); } void server(int port){ if ((ser=socket(AF_INET,SOCK_STREAM,0))<0){ printf("server create error\n"); exit(3); } struct sockaddr_in addr; int addr_len = sizeof(struct sockaddr); bzero(&addr,sizeof(addr)); addr.sin_family=AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr=htonl(INADDR_ANY); if (bind(ser,(struct sockaddr *)&addr,sizeof(addr))<0){ printf("bind error\n"); exit(7); } if (listen(ser,SOMAXCONN)<0){ printf("error when listen\n"); exit(8); } while (true){ int client = accept(ser,NULL,NULL); if (client<0){ printf("connect close\n"); break; }else{ char msg[SIZE]; int len=recv(client,msg,SIZE,0); msg[len]=0; printf("recv:\n%s\n",msg); send(client,buff,flen,0); close(client); } } } void usage(){ printf("usage: ./prob.o [port]"); } static void sigCancle(int signo){ if (signo==SIGINT){ printf("server closed\n"); close(ser); } } //end |
最近读者: