【实验目的】
1、熟练掌握套接字函数的使用方法。
2、应用套接字函数完成基本TCP通讯,实现服务器与客户端的信息交互。
【实验学时】
4学时
【实验内容】
实现一个服务器与一个客户之间通讯。具体功能如下:
(1)服务器端:
服务器端等待客户的连接,一旦连接成功,则显示客户的IP地址、端口号;
循环接收客户发来的信息并在终端上显示,同时在信息前加入序号并返回给客户端;当从客户接收到bye后不再发送给各户并退出程序。
(2)客户端:
根据用户从终端输入的服务器IP地址及端口号连接到相应的服务器;
连接成功后,循环从终端输入信息,并将信息发送给服务器,再从服务器接收信息,并显示在终端上。
当从终端输入bye并发送给服务器后,程序退出。
server:
#include<stdio.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdlib.h>
int main()
{
int sockfd,connectfd;
char rbuf[100];
char wbuf[100];
int port;
char ip[20];
struct sockaddr_in server;
struct sockaddr_in client;
socklen_t len;
len=sizeof(client);
int i=0;
//socket()
if((sockfd=socket(AF_INET, SOCK_STREAM, 0))==-1){
perror("socked failed");
exit(1);
}
printf("ip of client: ");
scanf("%s", ip);
printf("port of client:");
scanf("%d", &port);
bzero(&server, sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(port);
server.sin_addr.s_addr=inet_addr(ip);
//bind()
if((bind(sockfd, (struct sockaddr *)&server, sizeof(server)))==-1){
perror("bind error");
exit(1);
}
//listen()
if((listen(sockfd, 5))==-1){
perror("listen error");
exit(1);
}
//accept()
if((connectfd=accept(sockfd, (struct sockaddr *)&client, &len))==-1){
perror("accept error");
exit(1);
}
//read()/write()
while(1){
int r=read(connectfd, rbuf, sizeof(rbuf));
if(r<0){
perror("read error");
exit(1);
}
rbuf[r]='\0';
printf("client: %s\n", rbuf);
if(!strcmp(rbuf, "bye"))
break;
i++;
char buf[100];
sprintf(buf, "%d", i);
strcat(buf, rbuf);
int w=write(connectfd, buf, strlen(buf));
if(w==-1){
perror("write error");
exit(1);
}
}
//close
close(sockfd);
close(connectfd);
return 0;
}
client:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<netinet/in.h>
#include<sys/socket.h>
int main()
{
int sockfd;
char rbuf[100];
char wbuf[100];
int recv;
int port;
char ip[20];
struct sockaddr_in server;
struct sockaddr_in client;
socklen_t len;
len=sizeof(client);
char b[5]="bye";
b[3]='\n';
//socket()
if((sockfd=socket(AF_INET, SOCK_STREAM, 0))==-1){
perror("socked failed");
exit(1);
}
printf("ip of server: ");
scanf("%s", ip);
printf("port of server:");
scanf("%d", &port);
bzero(&server, sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(port);
server.sin_addr.s_addr=inet_addr(ip);
//connect()
connect(sockfd,(struct sockaddr *)&server,sizeof(server));
//write()/read()
getchar();
while(1){
bzero(&wbuf,100);
bzero(&rbuf,100);
printf("to server :");
fgets(wbuf,100,stdin);
write(sockfd,wbuf,strlen(wbuf));
if(strcmp(b,wbuf)==0)
break;
recv=read(sockfd,rbuf,sizeof(rbuf));
rbuf[recv]='\0';
printf("from server :%s",rbuf);
}
//close()
close(sockfd);
return 0;
}