实验二 服务器与单客户的连接处理
1、 实验目的
1.掌握单用户客户端跟服务器的连接和数据交互及处理。 2、 实验要求
1.认真阅读和掌握本实验的相关知识点。 2.上机编写并运行本程序。
3.保存和打印出程序的运行结果,并结合程序进行分析。 3、 实验内容 客户端:
1.从命令行读入服务器的IP地址;并连接到服务器;
2.循环从命令行读入一行字符串,并传递给服务器,由服务器对字符串反转,并将结果返回客户程序; 3.客户程序显示反转后的字符串; 服务器端:
4.接收客户的连接请求,并显示客户的IP地址和端口号; 5.接收客户传来的字符串,反转后传递给客户; 4、实验内容程序 (1)客户端程序如下: #include
#define MAXDATASIZE 1000 int main(int argc,char * argv[]) {
int fd,numbytes;
char buf[MAXDATASIZE]; struct hostent * he;
11
struct sockaddr_in server; int i=1; if(argc!=2) {
printf(\ \\n\ exit(-1); }
if((he=gethostbyname(argv[1]))==NULL){ perror(\
exit(-1);
}
if((fd=socket(AF_INET,SOCK_STREAM,0))==-1){ perror(\
exit(1);
}
bzero(&server,sizeof(server)); server.sin_family=AF_INET; server.sin_port=htons(PORT);
server.sin_addr=*((struct in_addr *)he->h_addr);
if(connect(fd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1) { perror(\
exit(1);
}
if((numbytes=recv(fd,buf,MAXDATASIZE,0))==-1) { perror(\
exit(1);
}
buf[numbytes]='\\0';
12
printf(\ while(i){
printf(\ scanf(\ if(strlen(buf)<1) i=0 ;
if((numbytes=send(fd,buf,strlen(buf),0))==-1) { perror(\
exit(1);
}
if((numbytes=recv(fd,buf,MAXDATASIZE,0))==-1) { perror(\
exit(1);
}
buf[numbytes]='\\0';
printf(\ %s\\n\ printf(\ } close(fd); }
(2)服务器端程序如下: #include
13
#define BACKLOG 2 #define MAXCHARSIZE 1000
void process_client(int connectfd,struct sockaddr_in client); int main(void) {
int listenfd,connectfd; struct sockaddr_in server,client; int sin_size;
int opt=SO_REUSEADDR; pid_t pid;
if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1) {
perror(\ exit(-1); }
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); bzero(&server,sizeof(server)); server.sin_family=AF_INET; server.sin_port=htons(PORT);
server.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(listenfd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1) { perror(\
exit(-1);
}
if(listen(listenfd,BACKLOG)==-1) { perror(\
exit(-1);
14
}
sin_size=sizeof(struct sockaddr_in); while(1){
if((connectfd=accept(listenfd,(struct sockaddr *) &client,&sin_size))==-1){ perror(\ exit(-1);
}
if((pid=fork())>0){ close(connectfd) ; continue; }
else if(pid==0){ close(listenfd);
process_client(connectfd,client); exit(1); } else {
perror(\ error.\\n\
exit(0);
} }
close(listenfd); }
void process_client(int connectfd,struct sockaddr_in client){ char recvbuf[MAXCHARSIZE]; char sendbuf[MAXCHARSIZE]; int recvlen,i; printf(\
get
a
from %s:%d\\n\ send(connectfd,\
connetion
15