linux实验报告 联系客服

发布时间 : 星期日 文章linux实验报告更新完毕开始阅读49185a84336c1eb91b375d34

操作2:建立到服务器的连接

基于流的网络客户连接到服务器包含以下两个步骤: (1)创建一个 socket

socket = socket ( PF_INET, SOCK_STREAM, 0 ) (2)使用该 socket 连接到服务器

connect ( sock, &serv_addr, sizeof ( serv_addr ) )

步骤2:

创建并连接客户socket到服务器

将这两个步骤抽象成一个函数:connet_to_server。当编写客户端程序时,只要调用该函数就可以建立到服务器的连接。具体如下: fd=connet_to_server(hostname, portnum) return -1 if error,

or a fd open for reading and writing connected to the socket at port ―portnum‖ on host ―hostname‖ /*

* socklib.c *

* This file contains functions used lots when writing internet * client/server programs. The two main functions here are: *

* make_server_socket( portnum ) returns a server socket * or -1 if error

* make_server_socket_q(portnum,backlog) *

* connect_to_server(char *hostname, int portnum) * returns a connected socket * or -1 if error */

socklib.c

#include #include #include #include #include #include

29

#include #include

#define HOSTLEN 256 #define BACKLOG 1

int make_server_socket_q(int , int );

int make_server_socket(int portnum) { return make_server_socket_q(portnum, BACKLOG); }

int make_server_socket_q(int portnum, int backlog) { struct sockaddr_in saddr; /* build our address here */ struct hostent *hp; /* this is part of our */ char hostname[HOSTLEN]; /* address */ int sock_id; /* the socket */ sock_id = socket(PF_INET, SOCK_STREAM, 0); /* get a socket */ if ( sock_id == -1 ) return -1; /** build address and bind it to socket **/ bzero((void *)&saddr, sizeof(saddr)); /* clear out struct */ gethostname(hostname, HOSTLEN); /* where am I ? */ hp = gethostbyname(hostname); /* get info about host */ /* fill in host part */ bcopy( (void *)hp->h_addr, (void *)&saddr.sin_addr, hp->h_length); saddr.sin_port = htons(portnum); /* fill in socket port */ saddr.sin_family = AF_INET ; /* fill in addr family */ if ( bind(sock_id, (struct sockaddr *)&saddr, sizeof(saddr)) != 0 ) return -1; /** arrange for incoming calls **/ if ( listen(sock_id, backlog) != 0 ) return -1; return sock_id; }

int connect_to_server(char *host, int portnum) {

30

}

int sock;

struct sockaddr_in servadd; /* the number to call */ struct hostent *hp; /* used to get number */ /** Step 1: Get a socket **/

sock = socket( AF_INET, SOCK_STREAM, 0 ); /* get a line */ if ( sock == -1 ) return -1; /** Step 2: connect to server **/

bzero( &servadd, sizeof(servadd) ); /* zero the address */ hp = gethostbyname( host ); /* lookup host's ip # */ if (hp == NULL) return -1;

bcopy(hp->h_addr, (struct sockaddr *)&servadd.sin_addr, hp->h_length); servadd.sin_port = htons(portnum); /* fill in port number */ servadd.sin_family = AF_INET ; /* fill in socket type */ if ( connect(sock,(struct sockaddr *)&servadd, sizeof(servadd)) !=0) return -1; return sock;

操作3:客户/服务器的会话

至此,可以使用专门的函数来建立服务器端,也有专门的函数来连接到服务器。 (1)一般的客户端

网络客户通常调用服务器来获得服务,一个典型的客户程序如下: mian(){ int fd; fd=connect_to_server(host, port); /*call the server*/ if(fd==-1) exit(1); /*or die*/ talk_with_server(fd); /*chat with server*/ close(fd); /*hang up when done*/ }

函数talk_with_server 处理与服务器的对话。具体的内容取决于特定应用。例如,e-mail客户和邮件服务器交谈的是邮件,而天气预报客户和服务器交谈的则是天气。 (2)一般的服务器端 一个典型的服务器如下:

31

main(){ int sock, fd; /*socket and connection*/ if(sock==-1) exit(1); while(1){ fd=accept(sock, NULL, NULL); /*take next call*/ if(fd==-1) break; /*or die*/ process_request(fd); /*chat with client*/ close(fd); /*hang up when done*/ }

函数process_trquest处理客户的请求。具体内容取决于特定的应用。 (3)服务器的设计问题:DIY或代理 两种服务器的设计方法:

DIY——服务器接收请求,自己处理工作。

代理——服务器接收请求,然后创建一个新进程来处理工作。 每种方法的优缺点:

自己做用于快速简单的任务 代理用于慢速的更加复杂的任务

使用SIGCHLD来阻止僵尸(zombie)问题

4.编写Web服务器

Web 服务器通常要具备3种用户操作: (1)列举目录信息 (2)cat 文件 (3)运行程序

web服务器

一个web服务器

1、运行程序 2、显示文件 3、显示目录

web浏览器

请求 应答

Web服务器通过基于流的socket连接为客户提供上述3种操作。用户连接到服务器后,

32