网络编程基础
网络编程的实现就必须有服务器和客户端的存在
服务器:为客户提供服务的一方
客户端:获取数据的为客户端,可以是任意一台主机,只要它和服务器存在连接,并且的到服务器的授权,就可以使用服务器提供的服务
有两种协议可以选择:
(1)TCP:面向连接的 可靠的 流式服务
(2)UDP:无连接 不可靠的 数据包服务
TCP 的编程流程:
服务器(server):socket bind listen accept recv/send close
客户端(client):socket /*bind*/ connect recv/send close
int socket(int domain, int type, int protocol);
domain 参数告诉系统使用哪个底层协议族
type 参数指定服务类型。服务类型主要有 SOCK_STREAM 服务(流服务)和 SOCK_UGRAM (数据报)服务,对 TCP/IP协议族而言,其值取 SOCK_STREAM 表示传输层使用 TCP 协议,取 SOCK_DGRAM 表示传输层使用 UDP 协议。
protocol 参数是在前两个参数构成的协议集合下,再选择一个具体的协议,不过这个值通常通常都是唯一的(前两个参数已经完全决定了它的值)。几乎在所有的条件下,我们都应该把它设置为 0,表示使用默认协议。
socket 系统调用成功时返回一个 socket 文件描述符,失败则返回 -1并设置errno。
int bind(int sockfd, struct sockaddr *addr, int addrlen);
addr:指定 IP 地址和端口号
struct sockaddr_in
{
sa_family_t sin_family; //地质族 AF_INET
u_int16_t sin_port; //端口号 网络字节序(大端模式) PC 机(小端模式)
struct in_addr sin_addr; //IP 地址
}
struct in_addr
{
u_int32_t s_addr; //IP 地址最终的表示
}
int listen(int sockfd, int size);
int accept(int sockfd, struct sockaddr *addr, int *addrlen);
addr:记录客户端的 IP 地址和端口号
accept 的返回值是获取到的和客户端连接的文件描述符
int connect(int sockfd, struct sockaddr *addr, int addrlen);
addr:要连接的服务器的 IP 地址和端口号
netstat -atp 显示本机上所有的 TCP 服务程序以及其占用的端口号