【unix网络编程】(一)简单概念梳理

1.看简单的客户端程序

代码可以比较容易地实现下载,这里就不贴原始代码了。详见P6页。

基本概念、常见结构体等

int main(int argc,char **argv);

argc:命令行总的参数的个数,即argv中元素的格式。
**argv:字符串数组,用来存放指向你的字符串参数的指针数组,每一个元素指向一个参数。
argv[0]:指向程序的全路径名。
argv[1]:指向在DOS命令行中执行程序名后的第一个字符串。
argv[2]:指向第二个字符串。

1.1 sockaddr_in

sockaddr_in在头文件#include<netinet/in.h>#include <arpa/inet.h>中定义
这里写图片描述

1.1.1 sin_addr

对于客户端而言,sin_addr是无需指定的,清零就可以了;
对于服务器来说,这个是需要指定自己的地址的。
INADDR_ANY里面给出了关于这里的一些解释:

一般情况下,如果你要建立网络服务器应用程序,则你要通知服务器操作系统:请在某地址 xxx.xxx.xxx.xxx上的某端口 yyyy上进行侦听,并且把侦听到的数据包发送给我。这个过程,你是通过bind()系统调用完成的。——也就是说,你的程序要绑定服务器的某地址,或者说:把服务器的某地址上的某端口占为已用。服务器操作系统可以给你这个指定的地址,也可以不给你。

如果你的服务器有多个网卡(每个网卡上有不同的IP地址),而你的服务(不管是在udp端口上侦听,还是在tcp端口上侦听),出于某种原因:可能是你的服务器操作系统可能随时增减IP地址,也有可能是为了省去确定服务器上有什么网络端口(网卡)的麻烦 —— 可以要在调用bind()的时候,告诉操作系统:“我需要在 yyyy 端口上侦听,所有发送到服务器的这个端口,不管是哪个网卡/哪个IP地址接收到的数据,都是我处理的。”这时候,服务器程序则在0.0.0.0这个地址上进行侦听。


获取时间的端口号是:13.

1.2 socket

原型:

int socket (int domain, int type, int protocol)

功能描述:
初始化创建socket对象,通常是第一个调用的socket函数。 成功时,返回非负数的socket描述符;
失败返回-1。socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用socket()函数时,socket执行体将建立一个socket,实际上”建立一个socket”意味着为一个socket数据结构分配存储空间。
参数:
domain – 指明使用的协议族。常用的协议族有,AF_INET,AF_UNIX等等。协议族决定了socket的地址类型,在通信中必须采用对应的地址。
AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合;
AF_UNIX决定了要用一个绝对路径名作为地址。

区别:
AF_INET是典型的TCP/IP四层模型的通信过程。
发送方、接收方依赖IP:Port来标识,即将本地的socket绑定到对应的IP端口上,发送数据时,指定对方的IP端口,经过Internet,可以根据此IP端口最终找到接收方;接收数据时,可以从数据包中获取到发送方的IP端口。

AF_UNIX典型的本地IPC,类似于管道,依赖路径名标识发送方和接收方。
AF_INET不仅可以用作本机的跨进程通信,同样的可以用于不同机器之间的通信,其就是为了在不同机器之间进行网络互联传递数据而生。而AF_UNIX则只能用于本机内进程之间的通信。


type – 指明socket类型,有3种:
SOCK_STREAM – TCP类型,保证数据顺序及可靠性;
SOCK_DGRAM – UDP类型,不保证数据接收的顺序,非可靠连接;
SOCK_RAW – 原始类型,允许对底层协议如IP或ICMP进行直接访问,不太常用。


protocol – 通常赋值”0”,由系统自动选择。

猜你喜欢

转载自blog.csdn.net/wushuomin/article/details/80402462