1.大端字节序,即低地址高字节
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。例如上一节的UDP段格式,
地址0-1是16位的源端口号,如果这个端口号是1000(0x3e8),则地址0是0x03,地址1是0xe8,
也就是先发0x03,再发0xe8,这16位在发送主机的缓冲区中也应该是低地址存0x03,高地址
存0xe8。但是,如果发送主机是小端字节序的,这16位被解释成0xe803,而不是1000。因此,发
送主机把1000填到发送缓冲区之前需要做字节序的转换。同样地,接收主机如果是小端字节序的,
接到16位的源端口号也要做字节序的转换。如果主机是大端字节序的,发送和接收都不需要做转
换。同理,32位的IP地址也要考虑网络字节序和主机字节序的问题。
处理方法: htonl/ htons / ntohl / ntohs (h表示host, n表示network)
2.int accept(int s,struct sockaddr * addr,int * addrlen); 此函数中, 最后一个参数int * addrlen 为传入传出参数。由于cliaddr_len是传入传出参数,每次调用accept()之前应该重新赋初值。
while (1) {
cliaddr_len = sizeof(cliaddr);
connfd = accept(listenfd,
(struct sockaddr *)&cliaddr, &cliaddr_len);
n = read(connfd, buf, MAXLINE);
...
close(connfd);
}
3.客户端是不需要bind()的,因为没要必要使用固定端口,它的端口由内核自动分配。而需要connect()
客户端需要调用connect()连接服务器,connect和bind的参数形式一致,区别在于bind的参数是自
己的地址,而connect的参数是对方的地址。