【实验目的】
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]=' '; printf("client: %s ", 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]=' '; //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]=' '; printf("from server :%s",rbuf); } //close() close(sockfd); return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。