文章目录
UNIX网络编程初入
!!!先前提醒!!!
本专栏内容为自学笔记,如有差错多谢批评指正。所有内容参考《UNIX网络编程》一书,结合书本和笔记学习最佳!!!
一、main函数传参
int mian(int argc, char **argv)
argc
表示传入argv
的字符串个数argv[0]
表示程序 运行的全路径argv[1]
表示传入的第一个字符串- 依次类似
二、#define和const
#define
定义的是常数,在编译的时候决定const
声明的是常量,只有程序运行的时候才定值(相对于变量而言)
三、unp.h头文件内置函数解读
-
err_sys(char[] mag)
当发生错误时,传入char[]字符串提示错误信息,并结束程序
-
bzero(char *add, int size)
使add地址的size大小空间清零
-
#define struct sockaddr SA
sockaddr为通用套接字地址结构
==注意:==每当一个套接字函数需要指向某个套接字地址结构的指针时,这个指针必须强制转换为通用套接字地址结构指针。这是因为套接字函数早于ANSI C标准。(感兴趣自行百度)
四、相关函数解读
4.1端口 和IP 的格式转换
网际套接字结构体 中必须使用特定的格式。使用相应提供的函数转换
-
htons(int 端口号)
主机到网络短整型,转换为二进制端口号
servaddr.sin_port = htons(13);
-
inet_pton(int 协议类型, char *点分十进制地址, char *赋值的结构体中的地址)
呈现形式到数值,例如127.0.0.1转为合适的格式
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) err_quit("inet_pton error for %s", argv[1]);
4.2创建套接字
socket创建一个网际字节流套接字,该函数返回一个小整数 描述符,以后所有函数调用该描述符来 标识这个套接字。(也就是句柄)
-
socket(AF_INET, SOCK_STREAM, 0)
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) err_sys("socket error");
4.3建立与服务器链接
int connect (int sockfd, struct sockaddr * serv_addr, int addrlen);
- 句柄
- 要连接的服务区地址,通用套接字指针
- 连接服务器套接字的大小(sizeof)
4.4读取数据
-
ssize_t read(int fd, void *buf, size_t count);
返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0
- 句柄
- 缓冲区
- 缓冲区大小
while ( (n = read(sockfd, recvline, MAXLINE)) > 0) { recvline[n] = 0; /* null terminate */ if (fputs(recvline, stdout) == EOF) err_sys("fputs error"); } if (n < 0) err_sys("read error");
4.5绑定套接字
int bind(int sockfd, const struct sockaddr *address, socklen_t address_len);
- 套接字句柄
- 绑定的地址结构
- 地址结构的大小(sizeof)
4.6监听套接字
-
Listen(listenfd, LISTENQ);
- 套接字句柄
- unp.h定义的排队的最大客户连接数
将listenfd转化为监听套接字
4.7接收套接字
int accept(int sockfd, void *addr, int *addrlen);
五、主机字节序、网络字节序
主机字节序指,在本主机的字节存储数据中,不同主机有大端小端之分,为了保持数据传输与接受的一致性,在网际传输中使用网络字节序,当数据达到客户端或服务端时再反解。
- inet_ntop()、inet_pton() : 点分十进制字符串(dotted-decimal notation)与网络字节序(network byte order)二进制数值互转
- htons()、ntohs(): 网络字节序(network byte order)与主机字节序(host byte order)互转