-
一、概念:
- 套接字:传输网络数据的软件设备。
- TCP的特点:可靠的、按序传递的、基于字节的面向连接的数据传输方的协议。传输过程中数据不会消失,按序传输数据,传输的数据不存在数据边界。
- UDP的特点:不可靠的、无序的、以数据高速传输为目的的协议。强调快速传输而非传输顺序,传输的数据可能丢失也可能损坏,传输的数据有数据边界,限制每次传输的大小。
- 网络模型(四层):应用层、TCP或UDP层、IP层、网络层。
- 三次握手,四次挥手。
- 半关闭状态:关闭一半的套接字缓存区,即关闭写缓存或者读缓存。
- 多播,广播:广播只能向同一网络(IP地址)内的主机发送消息,多播可以向不同网络的主机发送消息。
- IP地址分类。
- I/O复用:提高I/O使用效率的技术,Linux下主要有select和epoll。
- 条件触发和边缘触发。
- 大端序,小端序。
- 进程,多进程,僵尸进程,进程间通信。
- 线程,多线程。
-
二、创建接受连接请求的套接字(TCP)
- 调用socket函数,创建套接字。
- 调用bind函数,申请IP地址和端口号。
- 调用listen函数,使套接字变为可接受连接请求的状态。
- 调用accept函数,接受连接请求。
- 调用close函数,关闭套接字。
-
三、发送连接请求(TCP)
- 调用socket函数,创建套接字。
- 调用connect函数,发送连接请求。
- 调用close函数,关闭套接字。
-
四、相关头文件
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <string.h> #include <pthread.h> #include <sys/epoll.h> #include <sys/select.h> #include <signal.h>
-
五、相关类和函数
- int socket (int __domain, int __type, int __protocol);
- struct sockaddr_in;
- struct sockaddr;
- int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);
- int listen (int __fd, int __n);
- int accept (int __fd, __SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len);
- int shutdown (int __fd, int __how);
- int connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);
- int close (int __fd);
- setsockopt (int __fd, int __level, int __optname, const void *__optval, socklen_t __optlen); // 套接字设置
- ssize_t read (int __fd, void *__buf, size_t __nbytes); // 接受数据,阻塞
- ssize_t write (int __fd, const void *__buf, size_t __n); // 发送数据
- uint16_t htons (uint16_t __hostshort); // 转换端口号,处理大端序小端序号
- uint32_t htonl (uint32_t __hostlong); // 转换IP地址,处理大端序小端序号
- in_addr_t inet_addr (const char *__cp); // 转换IP地址
- struct hostent *gethostbyname (const char *__name);
- (select相关)
- fd_set;
- FD_ZERO(fd_set*);
- FD_SET(int fd, fd_set*);
- FD_CLR(int fd, fd_set*);
- int select (int __nfds, fd_set *__restrict __readfds, fd_set *__restrict __writefds, fd_set *__restrict __exceptfds, struct timeval *__restrict __timeout);
- (epoll相关)
- struct epoll_event;
- int epoll_create (int __size);
- int epoll_wait (int __epfd, struct epoll_event *__events, int __maxevents, int __timeout);
- int epoll_ctl (int __epfd, int __op, int __fd, struct epoll_event *__event);
- (下面的UDP)
- ssize_t sendto (int __fd, const void *__buf, size_t __n, int __flags, __CONST_SOCKADDR_ARG __addr, socklen_t __addr_len);
- ssize_t recvfrom (int __fd, void *__restrict __buf, size_t __n, int __flags, __SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len);