当前位置: 技术问答>linux和unix
谁能给一个客户/服务器系统的设计案例呀,小弟想学习!愿出高价!
来源: 互联网 发布时间:2015-05-13
本文导语: 谁能给一个客户/服务器系统的设计案例呀,小弟想学习!愿出高价! 小弟想学习linux下的客户/服务器系统的设计,以备以后设计游戏做前期的准备,不知那位大虾肯给一个,我愿出高价!当然是论坛的分了,我是学...
谁能给一个客户/服务器系统的设计案例呀,小弟想学习!愿出高价!
小弟想学习linux下的客户/服务器系统的设计,以备以后设计游戏做前期的准备,不知那位大虾肯给一个,我愿出高价!当然是论坛的分了,我是学生没有钱哦!
小弟想学习linux下的客户/服务器系统的设计,以备以后设计游戏做前期的准备,不知那位大虾肯给一个,我愿出高价!当然是论坛的分了,我是学生没有钱哦!
|
TCP 客户-服务器例子(一)
概述
回射服务器:echo server
7th 端口; /etc/inetd.conf
1.客户从标准输入读一行文本,写到服务器上
2.服务器从网络输入读此行,并回射给客户
3.客户读此回射行并写到标准输出。
--------------------------------------------------------------------------------
几个读写有关的函数
fputs 和 fgets 标准库函数
//简单的输入和输出程序:
// mystr_client.c
#include "unp.h"
void main(void)
{
char sendline[MAXLINE],recevline[MAXLINE];
fgets(sendline, MAXLINE, stdin); //标准输入
memcpy(recevline, sendline, strlen(sendline));
fputs(recevline, stdout); //标准输出
}
//writen 和 readline字节流读写函数
ssize_t Writen(int filedes, const void *buff, size_t nbytes);
ssize_t Readline(int filedes, void *buff, size_t maxlen);
--------------------------------------------------------------------------------
TCP回射服务器程序
//main源程序:
#include "unp.h"
int
main(int argc, char **argv)
{
int listenfd, connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr, servaddr;
listenfd = Socket(AF_INET, SOCK_STREAM, 0);//创建套接口
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);//9877
Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));//绑定端口
Listen(listenfd, LISTENQ);
for ( ; ; ) {
clilen = sizeof(cliaddr);
connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);//等待客户完成连接accept
if ( (childpid = Fork()) == 0) { /* child process */
Close(listenfd); /* close listening socket */
str_echo(connfd); /* process the request */
exit(0);
}
Close(connfd); /* parent closes connected socket */
}
}
//服务器程序str_echo 函数
//读如一行 Readline
//回射此行 Writen
#include "unp.h"
#include "sum.h"
void
str_echo(int sockfd)
{
ssize_t n;
struct args args;
struct result result;
for ( ; ; ) {
if ( (n = Readn(sockfd, &args, sizeof(args))) == 0)
return; /* connection closed by other end */
result.sum = args.arg1 + args.arg2;
Writen(sockfd, &result, sizeof(result));
}
}
--------------------------------------------------------------------------------
TCP回射客户端程序
//main创建套接口,装填IP地址结构socket bzero与服务器连接connect
#include "unp.h"
int
main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in servaddr;
if (argc != 2)
err_quit("usage: tcpcli ");
sockfd = Socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
Connect(sockfd, (SA *) &servaddr, sizeof(servaddr));
str_cli(stdin, sockfd); /* do it all */
exit(0);
}
//tcp回射客户程序str_cli函数
#include "unp.h"
void
str_echo(int sockfd)
{
long arg1, arg2;
ssize_t n;
char line[MAXLINE];
for ( ; ; ) {
if ( (n = Readline(sockfd, line, MAXLINE)) == 0)
//从服务器读回射行
return; /* connection closed by other end */
if (sscanf(line, "%ld%ld", &arg1, &arg2) == 2)
snprintf(line, sizeof(line), "%ldn", arg1 + arg2);
else
snprintf(line, sizeof(line), "input errorn");
n = strlen(line);
Writen(sockfd, line, n);//写到服务器
}
}
--------------------------------------------------------------------------------
正常启动
服务器后台启动 ./tcpserv01 &
检查监听套接口状态 netstat –a
过滤:netstat –a |grep 9877
启动客户端程序 ./tcpcli01 127.0.0.1
检查TCP的连接 netstat –a
过滤:netstat –a |grep 9877
检查进程的状态和关系 ps –l
tty控制台 ; pts/0伪终端
pid进程编号 ppid 父进程编号
父进程的ppid 是shell (bash)
状态S
I 空闲 Idle S 停止 stop Z 僵尸 zombie
状态 WCHAN
键入 EOF (Control-D)结束
概述
回射服务器:echo server
7th 端口; /etc/inetd.conf
1.客户从标准输入读一行文本,写到服务器上
2.服务器从网络输入读此行,并回射给客户
3.客户读此回射行并写到标准输出。
--------------------------------------------------------------------------------
几个读写有关的函数
fputs 和 fgets 标准库函数
//简单的输入和输出程序:
// mystr_client.c
#include "unp.h"
void main(void)
{
char sendline[MAXLINE],recevline[MAXLINE];
fgets(sendline, MAXLINE, stdin); //标准输入
memcpy(recevline, sendline, strlen(sendline));
fputs(recevline, stdout); //标准输出
}
//writen 和 readline字节流读写函数
ssize_t Writen(int filedes, const void *buff, size_t nbytes);
ssize_t Readline(int filedes, void *buff, size_t maxlen);
--------------------------------------------------------------------------------
TCP回射服务器程序
//main源程序:
#include "unp.h"
int
main(int argc, char **argv)
{
int listenfd, connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr, servaddr;
listenfd = Socket(AF_INET, SOCK_STREAM, 0);//创建套接口
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);//9877
Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));//绑定端口
Listen(listenfd, LISTENQ);
for ( ; ; ) {
clilen = sizeof(cliaddr);
connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);//等待客户完成连接accept
if ( (childpid = Fork()) == 0) { /* child process */
Close(listenfd); /* close listening socket */
str_echo(connfd); /* process the request */
exit(0);
}
Close(connfd); /* parent closes connected socket */
}
}
//服务器程序str_echo 函数
//读如一行 Readline
//回射此行 Writen
#include "unp.h"
#include "sum.h"
void
str_echo(int sockfd)
{
ssize_t n;
struct args args;
struct result result;
for ( ; ; ) {
if ( (n = Readn(sockfd, &args, sizeof(args))) == 0)
return; /* connection closed by other end */
result.sum = args.arg1 + args.arg2;
Writen(sockfd, &result, sizeof(result));
}
}
--------------------------------------------------------------------------------
TCP回射客户端程序
//main创建套接口,装填IP地址结构socket bzero与服务器连接connect
#include "unp.h"
int
main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in servaddr;
if (argc != 2)
err_quit("usage: tcpcli ");
sockfd = Socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
Connect(sockfd, (SA *) &servaddr, sizeof(servaddr));
str_cli(stdin, sockfd); /* do it all */
exit(0);
}
//tcp回射客户程序str_cli函数
#include "unp.h"
void
str_echo(int sockfd)
{
long arg1, arg2;
ssize_t n;
char line[MAXLINE];
for ( ; ; ) {
if ( (n = Readline(sockfd, line, MAXLINE)) == 0)
//从服务器读回射行
return; /* connection closed by other end */
if (sscanf(line, "%ld%ld", &arg1, &arg2) == 2)
snprintf(line, sizeof(line), "%ldn", arg1 + arg2);
else
snprintf(line, sizeof(line), "input errorn");
n = strlen(line);
Writen(sockfd, line, n);//写到服务器
}
}
--------------------------------------------------------------------------------
正常启动
服务器后台启动 ./tcpserv01 &
检查监听套接口状态 netstat –a
过滤:netstat –a |grep 9877
启动客户端程序 ./tcpcli01 127.0.0.1
检查TCP的连接 netstat –a
过滤:netstat –a |grep 9877
检查进程的状态和关系 ps –l
tty控制台 ; pts/0伪终端
pid进程编号 ppid 父进程编号
父进程的ppid 是shell (bash)
状态S
I 空闲 Idle S 停止 stop Z 僵尸 zombie
状态 WCHAN
键入 EOF (Control-D)结束