1. OSI7层模型 vs 四层模型
2. bzero vs memset
bzero:#include <stringh.h>,不是标准函数,在ANSI中没有定义。
memset:考虑兼容性等问题的时候还是使用memset吧。
3. TCP编程模型
时间服务器的源码如下:
TCP的连接方式之前在tcpip网路编程中一致,尹圣雨的书籍。
设备端连接上服务器后,将服务器的时间发送给客户端。
#include "socket_includes.h"
int main(int argc, char *argv[])
{
int listenfd, sockfd, opt = 1;
struct sockaddr_in server, client;
char buf[200];
socklen_t len;
int timep;
int ret;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if(listenfd < 0){
perror("Create socket fail.");
return -1;
}
if((ret = setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) < 0){
perror("Error, set socket reuse addr failed");
return -1;
}
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(8888);
server.sin_addr.s_addr = htonl(INADDR_ANY);
len = sizeof(struct sockaddr);
if(bind(listenfd, (struct sockaddr *)&server, len)<0){
perror("bind error.");
return -1;
}
listen(listenfd, MAX_LISTEN_QUE);
while(1){
sockfd = accept(listenfd, (struct sockaddr *)&client, &len);
if(sockfd < 0){
perror("accept error.");
return -1;
}
timep = time(NULL);
snprintf(buf, sizeof(buf), "%s", ctime(&timep));
write(sockfd, buf, strlen(buf));
printf("Bytes:%d\n", strlen(buf));
printf("sockfd=%d\n", sockfd);
close(sockfd);
}
return 0;
}
4. 三次握手、四次挥手流程
之前的课程中有提到过,这边不再描述,尹圣雨的tcpip编程。
5.网络字节序的转换问题
6. 进程传递到内核的函数:bind、connect、sendto
内核传递到进程的函数:accept, recvfrom,getsockname, getpeername
7. connect经常碰到的错误:
a. 硬错:端口号错误,服务器进程未开启,收到RST,立刻返回ECONNREFUSED;
b. 软错:IP不可达,协议ICMP,比如no route to host,通常是发送arp请求无响应。
8. accept中的最大连接数
对应两个队列:一个是已完成的连接队列;另一个是未完成的连接队列。
最大数指的就是已完成的连接队列最大数。