NetworkProgramming_笔记_3

TCP/IP: Echo Server/Client

To setup an application, two models:

  1. Client/Server model (Web)
    一个结点或是server,或是client
  2. Peer-to-peer (P2P) model (PPLive)
    一个server没了,一个client可以变server补充

Client/server model

  • Clent端 主动请求服务!
  • Server 同时服务于很多client

Client

  • client是一个过程,而不是说是具体的一台计算机/机器
  • client特别主动主动 (就像学生主动找老师)
  • client完成后才关闭服务

Before communication, client requires:

  1. IP address
  2. Post number
    多试错…注意IANA已经分配的

Client’s function:

考试会考,不同角度回答都行,下面也是正确的答案

  1. Translate the user’s request into the desired protocol.
  2. Send the request to the server.
  3. Wait for the server’s response.
  4. Translate the response into “human readable” results.
  5. Present the results to the user.

Server

  • Server是一个过程,而不是说是具体的一台计算机/机器
  • Server一旦开启,持续持续地运行
  • Server被动地去接受request (passively)
  • Server各方面都比Client复杂

两种类型的servers

  1. 迭代服务器 (Iterative)
    一个时间段,只能处理一个(老师指导)
  2. 并发服务器 (Concurrent)
    可处理多个 (老师上课)

Server’s function:

  1. Listen for a client’s query
  2. Process the query
  3. Return the results back to the client

一个典型的client/server交互:(考试稍微漏两条没答-没事)

  1. The user runs client software to create a query.
  2. The client connects to the server.
  3. The client sends the query to the server.
  4. The server accept the query.
  5. The server computes the result of the query.
  6. The server sends the results to the client.
  7. The client presents the results to the user.
    Client/Server Example: HTTP

TCP 客户端和服务端交互的流程图

TCP 客户端和服务端交互的流程图
这个必须要有印象,考试可能空几个出来让你填,特别是右边绿色部分。

比喻成打电话的过程

比喻成打电话

1. 电话的地址定义:

struct sockaddr {
	unsigned short sa family; // address family, 
	AF xxxchar sa data[14]; // 14 bytes of protocol address
};
struct sockaddr_in {
	shortintsin family;// Address family
	unsignedintsin _port; // Port numbershort
	structin addrsin addr; /* Internet address */
	unsignedsin zero[8];/* Same size as struct sockaddr */
};
struct in_addr {
	unsigned long s_addr;
};

sockaddr 和 sockaddr_in 结构体的区别:

sockaddr 是一个通用的地址结构体,用于传递和储存地址
sockaddr_in 是用于表示IPv4地址和端口号的结构体

Address family:

  1. AF_INET: IPv4
  2. AF_INET6: IPv6

Port number

16-bit TCP or UDP port number

sin_addr

32-bit IPv4地址

sin_zero

无实际意义。填充字段,以保持结构体 sockaddr_in 与 sockaddr 的大小一致。

2. 准备电话:

#include <sys/types.h>
#include <sys/socket.h>

int socket(int family, int type, int protocol)
	- return nonnegative descriptor, if OK,
	- -1, if error

mySock = socket(family, type, protocol)

在这里插入图片描述

int serv_sock;
int clnt_sock;

struct sockaddr_in serv_addr;
struct sockaddr_in clnt_addr;
socklen_t clnt_addr_size;

char message[] = "Hello MUST!";

if(argc != 2){
	print("usage : %s <port>\n", argv[0]);
	exit(1);
}

serv_sock = socket(PF_INET, SOCK_STREAM, 0);
if(serv_sock == -1)
	error_handling("socket() error");

3.用电话拨打号码

Bind: 给socket分配local IP地址和端口

#include <sys/socket.h>

int bind(int sockfd, const struct sockaddr* myaddr, unsigned int addrlen)
	- returns 0 if OK,
	- -1 if error

//bind addr/ip to socket
if (bind(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1)
{
	printf("bind error\n");
	exit(0);
}

Overall:

  1. Create a new socket;
  2. Print the fd of the socket
  3. Bind your local address/port to the socket.
    在这里插入图片描述

p.s

转网络字节序发送!

计算机存储是高节序还是低节序(考试考)?

  • 高节序(Big Endian): 高存低 | 0x12345678 字节的存储顺序为 12 34 56 78
  • 低节序(Little Endian):低存低 | 0x12345678 字节的存储顺序为 78 56 34 12

x86 和 x86-64 处理器:低节序
ARM 处理器:低节序/高节序,具体取决于处理器配置
PowerPC 处理器:高节序

以下是一些常见的文件描述符值的含义:

0: 标准输入(stdin)
1: 标准输出(stdout)
2: 标准错误输出(stderr)
其他文件描述符的值从 3 开始递增。

(补9.22课)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值