实验一、TCP服务器端程序设计_第1页
实验一、TCP服务器端程序设计_第2页
实验一、TCP服务器端程序设计_第3页
实验一、TCP服务器端程序设计_第4页
实验一、TCP服务器端程序设计_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验一、TCP服务器端程序设计一、实验目的1、学习Linux操作系统的基本命令用法。2、掌握在Linux操作系统如何编译和编辑C程序;3、掌握在Linux操作系统中编写服务器端程序的基本方法。二、实验内容2.1 进入Linux操作系统本实验是第一次使用Linux操作系统,熟悉 Linux操作系统并能熟练地使用Linux操作系统的基本命令是接下来所有实验的基本前提,因此建议读者能够反复使用下列命令,直到熟记在心为止。本次使用的Linux是安装在VMWare虚拟机中,所以使用Linux不会破坏任何原有Windows操作系统,所以请大家放心、大胆使用。启动程序管理器中的VMWare软件,界面如1-1

2、所示。图1-1、VMWare启动界面选择VMWare工具栏上的绿色箭头启动Linux操作系统,这时候您的电脑上实际上相当于两台电脑分别运行不同的操作系统。它们共享了物理设备,尤其要注意鼠标的变化。两个操作系统的鼠标切换为【Ctrl+Alt】键。注意VMWare软件的左下则状态栏有提示信息。Linux操作系统的登录界面如图1-2所示。图1-2、Linux登录界面1、 登录用户和密码本机设置了两个用户名: root和tx,密码均为,其中root为操作用户,tx为普通用户,两者的操作权限有着很大的区别,某些Linux命令与用户的权限有着极大的关系,所以切记使用每条命令时的用户权限,平时建议使用普通用

3、户,但在本次实验中我们以root用户登录。注意:Linux是严格区分字母大小写的。登录成功后的选择进入终端,终端是输入各种Linux命令的窗口。图1-3、Linux 终端软件2.2、Linux终端Linux终端就是一个Linux图形软件,如图1-4所示具有菜单栏等窗口软件常有的特征。例如可以调整窗口内容字体的大写。在终端的提示符下可以输入各种Linux命令,例如ls。从Linux命令提示符可以看出当前登录用户名。图1-4、Linux终端图1-5、Linux命令提示符2.2在Linux终端中编写第一个C程序1、 查看当前文件目录命令 pwd使用pwd命令可以查询当前目录,如下: rootloca

4、lhost root#pwd (回车)/root表明当前root用户所在的目录是/root,其中/表示根目录。2、改变目录命令 cd现在要求进入用tx用户主目录,Linux在创建每个普通用户时自动为该用户创建一个目录,该目录称为此用户的主录用,一般放在/home目录下。 rootlocalhost root#cd /home/tx rootlocalhost tx#pwd /home/tx3、编写C源程序编写第一个C程序,在Linux命令行下执行emacs命令,emacs是一款类似于Windows操作系统的记事本软件。如图1-6所示。图1-6、emacs软件界面现在在emacs软件中输入如下C

5、代码/* * 注释: hello.c C程序严格区分字母大小写*/#include int main () printf(“hello world!n”); return 0; 4、 编译、运行C程序将上述文件保存为hello.c,选择emacs菜单file中的Save Buffer As ( 第一次保存当前输入信息),并在下图1-7中红色框标注的地方输入hello.c文件名,然后就可以关闭emacs。在linux命令行中输入下列命令对C程序进行编译,首先使用ls命令查看当前目录中的文件。 其中gcc命令为编译c程序的编译软件, -o 表示输出编译后的执行文件,这里为hello。编译成功后使用

6、ls命令发现目录中多了一个hello文件,执行hello文件用./hello,其中./表示当前目录。图1-7、保存文件至此我们完成了一个在Linux操作系统中最简单的C程序编辑、编译、运行步骤。2.3 TCP服务器程序设计1、请在emacs文本编辑器中编写下列程序。(注意,下面是不同的4个文件)/* 文件名: TCPServer.c*/#include #include #include #include #include #include #include #include Practical.hstatic const int MAXPENDING = 5; / Maximum outst

7、anding connection requestsint main(int argc, char *argv) if (argc != 2) / Test for correct number of arguments DieWithUserMessage(Parameter(s), ); in_port_t servPort = atoi(argv1); / First arg: local port / Create socket for incoming connections int servSock; / Socket descriptor for server if (servS

8、ock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) 0) DieWithSystemMessage(socket() failed); / Construct local address structure struct sockaddr_in servAddr; / Local address memset(&servAddr, 0, sizeof(servAddr); / Zero out structure servAddr.sin_family = AF_INET; / IPv4 address family servAddr.sin_add

9、r.s_addr = htonl(INADDR_ANY); / Any incoming interface servAddr.sin_port = htons(servPort); / Local port / Bind to the local address if (bind(servSock, (struct sockaddr*) &servAddr, sizeof(servAddr) 0) DieWithSystemMessage(bind() failed); / Mark the socket so it will listen for incoming connections

10、if (listen(servSock, MAXPENDING) 0) DieWithSystemMessage(listen() failed); for (;) / Run forever struct sockaddr_in clntAddr; / Client address / Set length of client address structure (in-out parameter) socklen_t clntAddrLen = sizeof(clntAddr); / Wait for a client to connect int clntSock = accept(se

11、rvSock, (struct sockaddr *) &clntAddr, &clntAddrLen); if (clntSock 0) DieWithSystemMessage(accept() failed); char clntNameINET_ADDRSTRLEN; / String to contain client address if (inet_ntop(AF_INET, &clntAddr.sin_addr.s_addr, clntName, sizeof(clntName) != NULL) printf(Handling client %s/%dn, clntName,

12、 ntohs(clntAddr.sin_port); else puts(Unable to get client address); HandleTCPClient(clntSock); / NOT REACHED/* 文件名: Practical.h*/#ifndef PRACTICAL_H_#define PRACTICAL_H_#include #include #include void DieWithUserMessage(const char *msg, const char *detail);void DieWithSystemMessage(const char *msg);

13、void PrintSocketAddress(const struct sockaddr *address, FILE *stream);bool SockAddrsEqual(const struct sockaddr *addr1, const struct sockaddr *addr2);int SetupTCPServerSocket(const char *service);int AcceptTCPConnection(int servSock);void HandleTCPClient(int clntSocket);int SetupTCPClientSocket(cons

14、t char *server, const char *service);enum sizeConstants MAXSTRINGLENGTH = 128, BUFSIZE = 512,;#endif / PRACTICAL_H_/* 文件名: TCPServerUtility.c*/#include #include #include #include #include #include Practical.hvoid HandleTCPClient(int clntSocket) char bufferBUFSIZE; / Buffer for echo string / Receive

15、message from client ssize_t numBytesRcvd = recv(clntSocket, buffer, BUFSIZE, 0); if (numBytesRcvd 0) / 0 indicates end of stream / Echo message back to client ssize_t numBytesSent = send(clntSocket, buffer, numBytesRcvd, 0); if (numBytesSent 0) DieWithSystemMessage(send() failed); else if (numBytesS

16、ent != numBytesRcvd) DieWithUserMessage(send(), sent unexpected number of bytes); / See if there is more data to receive numBytesRcvd = recv(clntSocket, buffer, BUFSIZE, 0); if (numBytesRcvd 0) DieWithSystemMessage(recv() failed); close(clntSocket); / Close client socket/* 文件名: msg.c*/#include #include void DieWithUserMessage(const char *msg, const char *detail) fputs(msg, stderr); fputs(: , stderr); fputs(detail, stderr); fputc(n, stderr); exit(1);void DieWithSystemMessage(const char *msg) perror(msg); exit(1);2、 编译、运行编译运行命令如下,因为客户端程序尚未完成,所以我们不能看到服务器的运行结果,但您会发现服务器停止不动了

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论