?? server_lzl.c
字號(hào):
#include<netinet/in.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<erroe.h>
#include<netdb.h>
#include<stdio.h>
#define SERVER 1
#define SERVNAME" "
extern int errno;
/*define and init the vars*/
int sockfd=-1;
int port=5000;
main()
{
int i,num;
int childpid;
net_init(SERVNAME,port);
if((childpid=net_open())==0{
/*read and write through the description socked*/
str_echo();
net_close();
exit(0);
}
}
str_echo()
{
int n;
char line[512];
for(;;){
n=readline(sockfd,line,512);
if (n==0)
return;
else if (n<0)
printf("server:n<0 error\n");
if (writen(sockfd,line,n)!=n)
printf("server:writen error\n");
}
}
err_dump(str)
char *str;
{
printf("%s\n",str);
exit(1);
}
/*read"n"bytes from a description */
int
readn(fd,ptr,nbytes)
register int fd;
register char *ptr;
register int nbytes;
{
int nleft,nread;
nleft=nbytes;
while(nleft>0){
nread=read(fd,ptr,nleft);
if(nread<0)
return(nread);
else if(nread==0)
break;
nleft-=nread;
ptr+=nread;
}
return(nbytes-nleft);
}
/*write"n" bytes to a descriptor */
int
writen(fd,ptr,nbytes)
register int fd;
register char *ptr;
register int nbytes;
{
int nleft,nwritten;
nleft=nbytes;
while(nleft>0){
nwritten=write(fd,ptr,nleft);
if(nwritten<=0)
return(nwritten);
nleft-=nwritten;
ptr+=nwritten;
}
return(nbytes-nleft);
}
/*read a line from a description */
int
readline(fd,ptr,maxlen)
register int fd;
register char *ptr;
register int maxlen;
{
int n.rc;
char c;
for(n=1;n<maxlen;n++){
if ((rc=read(fd,&c,1)==1){
*ptr++=c;
if(c=='\n')
break;
}else if (rc==0){
if(n==1)
return(0);
else
break;
}else
return(-1);
}
*ptr=0;
return(n);
}
struct sockaddr_in tcp_srv_addr;
struct servent tcp_serv_info;
struct sockaddr_in tcp_cli_addr;
net_close()
{
close(sockfd);
sockfd=-1;
}
net_init(service,port)
char *service;
int port;
{
struct servent *sp;
bzero((char *)&tcp_srv_addr,sizeof(tcp_srv_addr));
tcp_srv_addr.sin_family=AF_INET;
tcp_srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
if(strlen(service)!=0){
if((sp=getservbyname(service,"tcp"))==NULL)
err_dump("net_init:unkown service:%s/tcp",service);
tcp_serv_info=*sp;
if(port>0)
tcp_srv_addr.sin_port=htons(port);
else
tcp_srv_addr.sin_port=sp->s_port;
}else{
if(port<=0){
err_dump("tcp_open:must specify either service or port"),
return(-1);
}
tcp_srv_sddr.sin_port=htons(port);
}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
err_dump("net_init:can't creat stream socket");
if(bind(sockfd,(struct sockaddr *)&tcp_srv_addr,sizeof(tcp_srv_addr))<0)
err_dump("net_init:can't bind local address");
listen(sockfd,5);
}
int net_open()
{
register int newsockfd,childpid,nbytes;
int clilen,on;
on=1;
again:
clilen=sizeof(tcp_cli_addr);
newsockfd=accept(sockfd,(struct sockaddr *)&tcp_cli_addr,&clilen);
if (newsockfd<0){
if(errno==EINTR){
errno=0;
goto again;
}
err_dump("accept error");
}
if((childpid=fork())<0)
err_dump("server can't forks");
else if (childpid>0){ /*parent*/
close(newsockfd);
return(childpid);
}
/*child*/
close(sockfd);
sockfd=newsockfd;
return(0);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -