TCP客户端 服务器端

  • 格式:docx
  • 大小:55.42 KB
  • 文档页数:5

一、实验目的1 、学习和掌握Linux 下的TCP 服务器基本原理和基本编程方法。

2 、学习和掌握Linux 下的TCP 客户端基本原理和基本编程方法。

二、实验平台ubuntu-8.04 操作系统三、实验内容1、编写Linux 下TCP 服务器套接字程序,程序运行时服务器等待客户的连接,一旦连接成功,则显示客户的IP 地址、端口号,并向客户端发送字符串。

2、编写Linux 下TCP 客户端套接字程序,结合实验一的服务器端程序,实现以下功能:(1)客户根据用户提供的IP 地址连接到相应的服务器;(2)服务器等待客户的连接,一旦连接成功,则显示客户的IP 地址、端口号,并向客户端发送字符串;(3)客户接收服务器发送的信息并显示。

四、实验原理使用TCP 套接字编程可以实现基于TCP/IP 协议的面向连接的通信,它分为服务器端和客户端两部分,其主要实现过程如图 1.1 所示:❖服务器端步骤①使用socket()创建套接字;②将创建的套接字绑定到指定的地址结构;③设置套接字为监听模式,进入被动接受连接状态;④接受请求,建立连接⑤读写数据⑥终止连接❖客户端步骤①创建套接字②与远程服务器建立连接③读/写数据;④终止连接五、实验步骤服务器端:1、登陆进入ubuntu 操作系统,新建一个文件,命名为tcpserver.c(为了方便起见,可以进入“home”,再进入用户目录,在用户目录下新建tcpserver.c)。

2、在tcpserver.c 中编写服务器端程序代码并保存。

3、在“终端”(“Applications”→“附件”→“终端”)中执行命令进入tcpserver.c所在目录。

(pwd 命令可以显示当前所在目录;ls 命令可以显示当前目录下的文件和文件夹信息;cd..命令可以进入上一级目录;cd 目录名命令可以进入当前所示的某个目录。

)4、执行命令gcc –o tcpserver tcpserver.c 生成可执行文件tcpserver。

5、执行命令./ tcpserver,观察结果。

6、认真分析源代码,体会如何编写一个TCP 服务器端程序。

客户端:1、登陆进入ubuntu 操作系统,新建一个文件,命名为tcpclient.c(为了方便起见,可以进入“home”,再进入用户目录,在用户目录下新建tcpclient.c)。

2、在tcpclient.c 中编写客户端程序代码并保存。

将实验一完成的tcpserver.c 拷贝到与tcpclient.c 同一目录下。

3、在“终端”(“Applications”→“附件”→“终端”)中执行命令进入tcpserver.c和tcpclient.c 所在目录。

4、执行命令gcc –o tcpserver tcpserver.c 生成可执行文件tcpserver。

5、执行命令./ tcpserver。

6、再开一个“终端”,进入tcpserver.c 和tcpclient.c 所在目录,执行命令gcc –o tcpclient tcpclient.c 生成可执行文件tcpclient。

7、执行命令./ tcpclient 127.0.0.1。

8、观察两个“终端”出现的结果。

六、参考程序服务器端:(tcpserver.c)#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/types.h> /*头文件的定义*/#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#define PORT 1234#define BACKLOG 1main(){int listenfd, connectfd;struct sockaddr_in server; /*定义一个Sockaddr_in的结构*/struct sockaddr_in client;socklen_t addrlen;if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) /*创建套接字*/{perror("Creating socket failed."); /*套接字创建失败*/exit(1);}int opt = SO_REUSEADDR;setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));bzero(&server,sizeof(server)); /* 将sockaddr_in server结构清零*/server.sin_family=AF_INET; /*再为这个结构赋值为IPV4*/server.sin_port=htons(PORT); /*字节排序函数*/server.sin_addr.s_addr = htonl (INADDR_ANY); /*地址转换函数*/if (bind(listenfd, (struct sockaddr *)&server, sizeof(server)) == -1) /*函数调用时,将这个结构强制转换为sockaddr类型*/ {perror("Bind error.");exit(1);}if(listen(listenfd,BACKLOG) == -1) /*判断数据响应*/{ /* calls listen() */perror("listen() error\n");exit(1);}addrlen = sizeof(client); /*表示地址参数(client)的长度*/if ((connectfd = accept(listenfd,(struct sockaddr *)&client,&addrlen))==-1) /*数据响应*/{perror("accept() error\n");exit(1);}printf("You got a connection from cient's ip is %s, prot is %d\n",inet_ntoa(client.sin_addr),htons(client.sin_port));send(connectfd,"Welcome to my server.\n",22,0); /*链接成功*/close(connectfd); /*关闭连接*/close(listenfd); /*关闭响应*/}客户端:(tcpclient.c)#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h> /*头文件的定义*/#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#define PORT 1234#define MAXDATASIZE 100int main(int argc, char *argv[]){int sockfd, num; /*将要建立连接的套接口描述字*/char buf[MAXDATASIZE];struct hostent *he;struct sockaddr_in server; /*定义一个Sockaddr_in的结构*/if (argc !=2){printf("Usage: %s <IP Address>\n",argv[0]);exit(1);}if ((he=gethostbyname(argv[1]))==NULL) /*执行空操作*/{printf("gethostbyname() error\n");exit(1);}if ((sockfd=socket(AF_INET, SOCK_STREAM, 0))==-1) /*IPV4错误检查*/ {printf("socket() error\n");exit(1);}bzero(&server,sizeof(server)); /* 将sockaddr_in server结构清零*/ server.sin_family = AF_INET; /*再为这个结构赋值为IPV4*/server.sin_port = htons(PORT); /*将16位的短整型数从主机字节序转换成网络字节序*/ server.sin_addr = *((struct in_addr *)he->h_addr); /*字节排序*/if(connect(sockfd, (struct sockaddr *)&server,sizeof(server))==-1) /*开始连接*/{printf("connect() error\n");exit(1);}if ((num=recv(sockfd,buf,MAXDATASIZE,0)) == -1) /*将输入的地址与默认地址相比较*/ {printf("recv() error\n");exit(1);}buf[num-1]='\0';printf("Server Message: %s\n",buf); /*数据响应得到客户口令*/close(sockfd); /*关闭连接*/}七、实验小结本次实验通过首次接触Linux操作系统,使我们能够逐步的熟悉Linux操作系统的使用,特别是一些常用Linux命令必须熟练掌握,此外我们还了解C语言程序的一般编辑、编译和运行方法,并对课文中TCP服务器程序有了更深的体会。