Microsoft Word - Socket±à³Ì.doc

Size: px
Start display at page:

Download "Microsoft Word - Socket±à³Ì.doc"

Transcription

1 Socket 编程 参考 UNP 第一卷 chinaunix 论坛 一 基本知识主机字节序和网络字节序主机字节序即内存中存储字节的方法有 : 1. Little endian: 将低序字节存储在起始地址 2. Big endian: 将高序字节存储在起始地址 网络字序表示网络协议在处理多字节时的顺序, 一律为 big endian 主机字节序和网络字节序转换的函数 : #include <netinet/in.h> uint16_t htons(uint16_t <16 位的主机字节序 >) uint32_t htonsl(uint32_t <32 位的主机字节序 >) // 转换为网络字节序 uint16_t ntohs(uint16_t <16 位的网络字节序 >) uint32_t ntohl(uint32_t <32 位的网络字节序 >) // 转换为主机字节序 缓冲区每个 TCP SOCKET 有一个发送缓冲区和一个接收缓冲区,TCP 具有流量控制, 所以接收缓冲区的大小就是通知另一端的窗口的大小, 对方不会发大于该窗口大小的数据 ; 而 UDP SOCKET 只有一个接收缓冲区无流量控制, 当接收的数据报溢出时就会被丢弃 通信域 ( 地址族 ) 套接字存在于特定的通信域 ( 即地址族 ) 中, 只有隶属于同一地址族的套接字才能建立对话 Linux 支持 AF_INET(IPv4 协议 ) AF_INET6(IPv6 协议 ) 和 AF_LOCAL(Unix 域协议 ) 套接口 (socket)= 网络地址 + 端口号, 要建立一个套接口必须调用 socket 函数, 套接口有三种类型, 即字节流套接口 (SOCK_STREAM), 数据报套接口 (SOCK_DGRAM) 和原始套接口 (SOCK_RAW) 定义一个连接的一个端点的两元组, 即 IP 地址和端口号, 称为一个套接口 在网络连接中, 两个端点所组成的四元组 ( 即本地 IP 本地 PORT 远程 IP 和远程 PORT) 称为 socket pair, 该四元组唯一的标识了一个网络连接 该情况可通过 netstat 验证 二 socket 地址结构 1. IPv4 的 Socket 地址结构 ( 定长 ) Struct in_addr In_addr_t s_addr; // 32 位 IP 地址, 网络字节序 Struct sockaddr_in Uint8_t sin_len;//ipv4 为固定的 16 字节长度 Sa_family_t sin_family; // 地址簇类型, 为 AF_INET In_port_t sin_port; //16 位端口号, 网络字节序

2 Struct in_addr sin_addr; // 32 位 IP 地址 Char sin_zero[8]; // 未用 2. IPv6 的 socket 地址结构 ( 定长 ) struct in6_addr uint8_t s6_addr[16]; //128 位 IP 地址, 网络字节序 struct sockaddr_in6 uint8_t sin6_len; //IPv6 为固定的 24 字节长度 sa_family_t sin6_family; // 地址簇类型, 为 AF_INET6 in_port_t sin6_port; //16 位端口号, 网络字节序 uint32_t sin6_flowinfo; //32 位流标签 struct in6_addr sin6_addr; //128 位 IP 地址 3. UNIX 域 socket 地址结构 ( 变长 ) Struct sockaddr_un, 地址簇类型为 AF_LOCAL 4. 数据链路 socket 地址结构 ( 变长 ) struct sockaddr_dl, 地址簇类型为 AF_LINK 5. 通用的 socket 地址结构 struct sockaddr uint8_t sa_len; sa_family_t sa_family; char sa_data[14]; 三 C/S 网络编程初始化 sock 连接符 : int socket(int domain, int type, int protocol); 函数返回 socket 描述符, 返回 -1 表示出错 domain 参数只能取 AF_INET, protocol 参数一般取 0 应用示例 : TCP 方式 :sockfd = socket(af_inet,sock_stream,0); UDP 方式 :sockfd =socket(af_inet, SOCK_DGRAM,0); 绑定端口 : int bind(int sockfd, struct sockaddr *sa, int addrlen); 函数返回 -1 表示出错, 最常见的错误是该端口已经被其他程序绑定 需要注意的一点 : 在 Linux 系统中,1024 以下的端口只有拥有 root 权限的程序才能绑定 连接网络 ( 用于 TCP 方式 ):

3 int connect(int sockfd, struct sockaddr *servaddr, int addrlen); 函数返回 -1 表示出错, 可能是连接超时或无法访问 返回 0 表示连接成功, 可以通过 sockfd 传输数据了 监听端口 ( 用于 TCP 方式 ): int listen(int sockfd, int queue_length); 需要在此前调用 bind() 函数将 sockfd 绑定到一个端口上, 否则由系统指定一个随机的端口 接收队列 : 一个新的 Client 的连接请求先被放在接收队列中, 直到 Server 程序调用 accept 函数接受连接请求 第二个参数 queue_length, 指的就是接收队列的长度也就是在 Server 程序调用 accept 函数之前最大允许的连接请求数, 多余的连接请求将被拒绝 响应连接请求 ( 用于 TCP 方式 ): int accept(int sockfd,struct sockaddr *addr,int *addrlen); accept() 函数将响应连接请求, 建立连接并产生一个新的 socket 描述符来描述该连接, 该连接用来与特定的 Client 交换信息 函数返回新的连接的 socket 描述符, 错误返回 -1 addr 将在函数调用后被填入连接对方的地址信息, 如对方的 IP 端口等 addrlen 作为参数表示 addr 内存区的大小, 在函数返回后将被填入返回的 addr 结构的大小 accept 缺省是阻塞函数, 阻塞直到有连接请求应用示例 : struct sockaddr_in their_addr; /* 用于存储连接对方的地址信息 */ int sin_size = sizeof(struct sockaddr_in); ( 依次调用 socket(), bind(), listen() 等函数 ) new_fd = accept(sockfd, &their_addr, &sin_size); printf( 对方地址 : %s\n", inet_ntoa(their_addr.sin_addr)); 关闭 socket 连接 : int close(int sockfd); 关闭连接将中断对该 socket 的读写操作 关闭用于 listen() 的 socket 描述符将禁止其他 Client 的连接请求 部分关闭 socket 连接 : int shutdown(int sockfd, int how); Shutdown() 函数可以单方面的中断连接, 即禁止某个方向的信息传递 参数 how: 0 - 禁止接收信息 1 - 禁止发送信息 2 - 接收和发送都被禁止, 与 close() 函数效果相同 socket 轮询选择 : int select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct

4 timeval *timeout); 应用于多路同步 I/O 模式 ( 将在同步工作模式中详细讲解 ) FD_ZERO(*set) 清空 socket 集合 FD_SET(s, *set) 将 s 加入 socket 集合 FD_CLR(s, *set) 从 socket 集合去掉 s FD_ISSET(s, *set) 判断 s 是否在 socket 集合中 常数 FD_SETSIZE: 集合元素的最多个数等待选择机制 : int poll(struct pollfd *ufds, unsigned int nfds, int timeout); 是 select 机制的一个变种, 应用于多路同步 I/O 模式 ( 将在同步工作模式中详细讲解 ) ufds 是 pollfd 结构的数组, 数组元素个数为 nfds struct pollfd int fd; /* 文件描述字 */ short events; /* 请求事件集合 */ short revents; /* 返回时间集合 */ ; 接收 / 发送消息 : TCP 方式 : int send(int s, const void *buf, int len, int flags); int recv(int s, void *buf, int len, int flags); 函数返回实际发送 / 接收的字节数, 返回 -1 表示出错, 需要关闭此连接 函数缺省是阻塞函数, 直到发送 / 接收完毕或出错注意 : 如果 send 函数返回值与参数 len 不相等, 则剩余的未发送信息需要再次发送 UDP 方式 : int sendto(int s, const void *buf, int len, int flags, const struct sockaddr *to, int tolen); int recvfrom(int s,void *buf, int len, int flags, struct sockaddr *from, int *fromlen); 与 TCP 方式的区别 : 需要指定发送 / 接收数据的对方 ( 第五个参数 to/from) 函数返回实际发送 / 接收的字节数, 返回 -1 表示出错 函数缺省是阻塞函数, 直到发送 / 接收完毕或出错注意 : 如果 send 函数返回值与参数 len 不相等, 则剩余的未发送信息需要再次发送 注意, 网络字节流的读写不同于文件的读写, 由于 socket 缓冲的因素, 可能读写的字节数小于所指定的字节数 所以可以使用如下函数 : ssize_t readn(int fd, void * buf,size_t n) ssize_t nleft; ssize_t nread; char *ptr; ptr = buf;

5 nleft = n; while (nleft > 0) if ((nread = read(fd, ptr, nleft)) < 0) if (errno == EINTR) nread = 0; else return (-1); else if (nread == 0) //EOF break; nleft -= nread; ptr += nread; return (n - nleft); ssize_t written(int fd,const void *buf,size_t n) ssize_t nleft; ssize_t nwrite; const char *ptr; ptr = buf; nleft = n; while (nleft > 0) if (nwrite = write(fd, ptr, left) <= 0) if (errno == EINTR) nwrite = 0; else return (-1); nleft -= nwrite; ptr += nwrite; return (n); 基于消息的方式 : int sendmsg(int s, const struct msghdr *msg, int flags); int recvmsg(int s, struct msghdr *msg, int flags); 标志位 : 上面这六个发送 / 接收函数均有一个参数 flags, 用来指明数据发送 / 接收的标志, 常用的标

6 志主要有 : MSG_PEEK 对数据接收函数有效, 表示读出网络数据后不清除已读的数据 MSG_WAITALL 对数据接收函数有效, 表示一直执行直到 buf 读满 socket 出错或者程序收到信号 MSG_DONTWAIT 对数据发送函数有效, 表示不阻塞等待数据发送完后返回, 而是直接返回 ( 只对非阻塞 socket 有效 ) MSG_NOSIGNAL 对发送接收函数有效, 表示在对方关闭连接后出错但不发送 SIGPIPE 信号给程序 MSG_OOB 对发送接收都有效, 表示读 / 写带外数据 (out-of-band data) IP 地址字符串和网络字节序的二进制 IP 地址相互转换的函数 : #inlcude <arpa/inet.h> int inet_aton(const char * <IP 地址字符串 >, struct in_addr * <32 位的网络字节序形式的 IP 地址 >) 成功 1 失败 0 [ 通用地址函数 ]int inet_pton(int < 地址簇类型 >, 可以是 AF_INET/AF_INET6>,const char * <IP 地址字符串 >,void * <32 位的网络字节序形式的 IP 地址 >) 成功 1 格式错误 0 失败 0 in_addr_t inet_addr(const char * <IP 地址字符串 >) 返回 32 位网络字节序的 IP 地址, 失败 INADDR_NONE char *inet_ntoa(struct in_addr <32 位的网络字节序形式的 IP 地址 >) 返回 IP 地址字符串 const char * inet_ntop(int < 地址簇类型 >, const void * <32 位的网络字节序形式的 IP 地址 >, char * <IP 地址字符串 >, size_t <IP 地址字符串的最大长度 >) 返回指向结果 <IP 地址字符串 > 的指针 字节顺序转换 htons()--"host to Network Short" htonl()--"host to Network Long" ntohs()--"network to Host Short" ntohl()--"network to Host Long" 连接过程是通过一系列状态表示的, 这些状态有 :LISTEN,SYN-SENT,SYN-RECEIVED, ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT 和 CLOSED CLOSED 表示没有连接, 各个状态的意义如下 : LISTEN - 侦听来自远方 TCP 端口的连接请求 ; SYN-SENT - 在发送连接请求后等待匹配的连接请求 ;

7 SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认 ; ESTABLISHED - 代表一个打开的连接, 数据可以传送给用户 ; FIN-WAIT-1 - 等待远程 TCP 的连接中断请求, 或先前的连接中断请求的确认 ; FIN-WAIT-2 - 从远程 TCP 等待连接中断请求 ; CLOSE-WAIT - 等待从本地用户发来的连接中断请求 ; CLOSING - 等待远程 TCP 对连接中断的确认 ; LAST-ACK - 等待原来发向远程 TCP 的连接中断请求的确认 ; TIME-WAIT - 等待足够的时间以确保远程 TCP 接收到连接中断请求的确认 ; CLOSED - 没有任何连接状态 ; Tcp 面向连接如下图所示 :

8 Client( 被动打开 ) Socket() Connect() 3 ESTABLISHED 状态 Write() 1 CLOSED 状态 #include <sys/socket.h> int connect (int socket 描述字, const struct sockaddr * 服务器的 SOCKET 地址, socklen_t 服务器的 SOCKET 地址结构长度 ) 0 成功 1 失败 2 SYN_SENT 状态 1 CLOSED 状态 2 LISTEN 状态 Server( 主动打开 ) Socket() Bind() Listen() #include <sys/socket.h> int socket(int < 协议簇类型 >, int < 套接口类型, SOCK_STREAM( 字节流套接口 ) SOCK_DGRAM( 数据报套接口 ) SOCK_RAW( 原始套接口 )>, int protocol) 非负整数表示 socket 描述字 -- 成功 -1- 失败 #include <sys/socket.h> int bind(int <socket 描述字 >, const struct sockaddr *< 服务器方指定的 SOCKET 地址 >, socklen_t <SOCKET 地址结构长度 >) 0- 成功 1- 失败若 SOCKET 地址中 :IP 地址为通配地址 INADDR_ANY(0), 或 PORT 为 0, 都表示为让内核选择 #include <sys/socket.h> int listen(int <socket 描述字 >, int < 为该 socket 的排队的最大连接个数, 为 SERVER 端 未完成连接 和 已完成连接 两个队列的总和 >) 0 成功 -1- 出错 Accept() #include <sys/socket.h> int accept(int < 监听的 socket 描述字 >, struct sockaddr * < 客户端的 SOCKET 地址 >, socklen_t * <socket 结构地址长度, 调用前初值为第二个参数的结构长度 >) 非负描述字 ( 已连接套接口 )- 成功 -1- 出错 3 进入未完成连接队列中,SYN_RCVD 状态 4 转入已完成队列队列中, ESTABLISHED 状态 4 FIN_WAIT1 状态 Read() Read() Close() Write() 5 CLOSED_WAIT 5 FIN_WAIT2 状态 Read() Close() 6 TIME_WAIT 状态 TIMEOUT>=2MSL(max segement lifetime 1-4 分钟 ) 7 CLOSED 状态 7 CLOSED 6 LAST_ACK

9 TIME_WAIT 状态 一个 tcp 协议的 socket 编程例子 : [Server] /* 主函数 */ int listenfd, connfd; struct sockaddr_in servaddr, cliaddr; struct hostent *hp; struct servent *sp; struct in_addr **pptr; if ((hp = gethostbyname(argv[1])) == NULL) //error if ((sp = getservbyname(argv[2], tcp )) == NULL) //error pptr = (struct in_addr **)hp->h_addr_list; listenfd = socket(af_inet, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; //servaddr.sin_addr.s_addr = htonl(inaddr_any); memcpy(&servaddr.sin_addr, *pptr, sizeof(struct in_addr)); servaddr.sin_port = htons(portnum); bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); listen(listenfd, listenqueuenum); signal(sigchld,sig_chld); for (;;) len = sizeof(cliaddr); if ((connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &len)) < 0) if (errorno==eintr) continue; else perror( accept error ); if (fork()==0) // 子进程, 复制父进程的所有描述字, 所以 listenfd 和 connfd 被父子进程所共享, 描述字的访问记数值都累计为 2 close(listenfd); printf( connection from %s, port %d\n, inet_ntop(af_inet, &cliaddr,.sin_addr, buf, sizeof(buf)), ntohs(cliaddr.sin_port)); snprintf(buf, ); write(connfd, buf, strlen(buf)); //process

10 close(connfd); // 处理结束后关闭 socket 连接 exit(0); // 子进程退出 close(connfd); // 父进程用不到 connfd, 可以将其关闭, 由于描述字的访问记数值由 2 减 1, 不会触发 FIN 分节,( 和 shundown 不同 ) 只有为 0 时, 才真正关闭连接 自选端口应该大于 1023( 不要是保留端口 ), 小于 49152( 临时端口 ) /* SIDCHLD 信号处理函数 */ vod sig_chld(int signo) pid_t pid; int stat; while ((pid = waitpid(-1, &stat, WNOHANG)) > 0); return; [client] sockfd=socket(af_inet,sock_stream,0); bzero(&servaddr, sizeof(servaddr)); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_familf=af_inet; servaddr.sin_port=htons(serv_port); inet_pton(af_inet, SERV_IP_STRING, &servaddr.sin_addr); connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(servaddr);.//process exit(0); 终止网络连接的正常方法是调用 close(), 但是有两个限制 : 1. 将描述字的访问计数 -1, 到 0 时才激发 TCP 连接的终止序列 ( 丢弃接收缓冲区里的数据, 发送发送缓冲区里的数据, 如果描述字的访问计数为 0, 在数据之后发出 FIN) 2. 终止了数据传输的两个方向, 读和写 shutdown 可以关闭一半连接, 而且在发完发送缓冲区里的数据后立即发出 FIN 序列 UDP 无连接编程时, 在 SERVER 端少了 accept() 和 listen(), 客户端少了 connect(), 因为是无连接的, 所以不用 close(), 读写一般用 sendto() 和 recvfrom() 如果 client 发送的数据被路由丢弃或者服务器的应答信息丢失, 那么 client 将一直阻塞, 直到应用设置的超时到达,UDP 需要应用来做接受确认 传输超时或者重传的机制 一般的,UDP 服务属于迭代的, 而 TCP 服务大多数是并发的 用 I/O 复用方式 (select()) 实现 ( 可以避免为每个客户端连接创建一个进程的开销 ): [server] int client[fd_setsize];

11 fd_set allset, rset; maxfd = listenfd; maxi = -1; for (I = 0; I < FD_SETSIZE; i++) client[i] = -1; FD_ZERO(&allset); FD_SET(listenfd, &allset); For (;;) rset = allset; nready = select(maxfd+1, &rset, NULL, NULL, NULL); if (FD_ISSET(listenfd, &rset)) // 新连接 clilen = sizeof(cliaddr); connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen); for (i = 0; I < FD_SETSIZE; i++) if (client[i] < 0) // 找出 client 数组中第一个 -1 的单元存放已经连接的 socket client[i] = connfd; break; if (I == FD_SETSIZE) fprintf(stderr, too many clients\n ); FD_SET(connfd, &allset); If (connfd > maxfd) Maxfd = connfd; If (I > maxi) Maxi = I; If (--nready <= 0) Continue; for (I = 0; I <= maxi; i++) if ((sockfd = client[i]) < 0) continue; if (FD_ISSET(sockfd, &rset)) if ((n = read(sockfd, )) == 0) // 客户端已经关闭连接 close(sockfd); FD_CLR(sockfd, &allset); Client[i] = -1; else //process if (--nready <=0 ) break;

12 用这种方法有一个问题 : 容易受 DDOS 攻击 如一个客户端发一个字节, 就睡眠, 该程序将阻塞在 read() 上, 无法再为其他合法的客户端服务 解决方法 : 1. 非阻塞 I/O 2. 为每个连接创建进程或线程 3. 对 I/O 操作设置操时 四 常用函数函数中均使用通用地址结构, 所以一般要将特定协议的地址转换成通用地址结构 1. 从进程到内核 bind connect sendto sendmsg 2. 从内核到进程 Accept Recvfrom Recvmsg Getpeername Getsockname 3.. 解析器函数 : ethostbyname gethostbyaddr getservbyname 端口号是以网络字节序返回的 getservbyport 参数 port 必须是网络字节序, 所以要调用 htons(port num) 4.I/O 流和描述字 fdopen(): 将描述字 (int) 转换为 I/O 流 (FILE *) fileno(): 将 I/O 流转换为描述字注意 : 虽然一个 I/O 流也是全双工的, 但是读和写之间必须要有一些如 fflush(),fseek(),fsetpos(),rewind() 函数 最好的办法是对一个描述字创建两个流, 读和写分开 FILE *fin, *fout; Fin = fdopen(sockfd, r); Fout = fdopen(sockfd, w ); Fgets( ); Fputs( ); 但是这种标准 I/O 库的编程必须注意当前的缓冲方式 : 完全缓冲 : 只有缓冲区满 fflush() 或进程 exit() 时才输出 I/O 行缓冲

13 不缓冲 五 僵尸进程 Zombie<defunct> 进程 : 一个子进程终止, 系统内核会发出 SIGCHLD 信号, 如果程序中没有用 singal sigaction 进行 SIG_IGN 处理, 也没有用 wait waitpid 进行等待, 结束的子进程就会变为僵尸进程 僵尸进程产生的目的是保存子进程的信息, 以便父进程在以后某个时刻需要取回如果一个进程终止, 但子进程有 Zombie 状态, 这时他们的父进程将由 pid=1 的 init 进程接管, 用 wait 来等待负责收回僵尸进程的资源 僵尸进程占用内核空间, 六 I/O 模式 5 个 I/O 模式 : 1. 阻塞 I/O 2. 非阻塞 I/O 设置该标志代码 : int flags; if ((flags = fcntl(fd, F_GETFL, 0)) < 0) // 出错处理 flags = O_NONBLOCK; if ((fcntl(fd, F_SETFL, flags)) < 0) // 出错处理关闭该标志代码 : flags &= ~O_NONBLOCK; 非阻塞 connect 的典型应用 : // 设置 sockfd 为非阻塞, 如上述代码 if ((n = connect( )) < 0) if (errno!= EINPROCESS) // 正常情况下,connect 连接有一定时间, 应该返回 EINPROCESS return(-1); if (n == 0) // 特殊情况, 如 CLIENT 和 SERVER 在同台主机上, 连接快速返回 goto done; FD_ZERO(&rset); FD_SET(sockfd &rset); West = rset; Struct timeval val; Val.tv_sec = ; Val.tv_usec = 0; If ((n = select(sockfd+1, &rset, &west, NULL, &val)) == 0) // 超时 Errno = ETIMEOUT; Close(sockfd);

14 Return(-1); int error; if (FD_ISSET(sockfd, &rset) FD_ISSET(sockfd, &west)) len = sizeof(error); if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) // 检查 SOCKET 上待处理的错误 return(-1); else // 出错处理, 表示在这段时间内没连接上 SERVER done: fcntl(sockfd, FD_SETFL, flags); // 恢复为原来的模式 if (error) close(sockfd); errno = error; return(-1); return(0); 3. I/O 复用 4. 信号驱动 I/O(SIGIO) 5. 异步 I/O 前 4 个 I/O 模式都属于同步 I/O, 因为它们都阻塞于 I/O 的操作 ( 即 I/O 数据准备好时, 从内核空间往用户空间拷贝数据 ) 七 守护进程在后台运行并且与终端脱离联系的进程, 只要系统不停止就一直运行着 有几种方式启动 : 1./etc/rcx.d 下的启动脚本 2.Inetd 启动 3.Cron 或者 at 启动守护进程的输出信息一般通过 SYSLOG 输出函数示例 : #include <syslog.h> #define MAXFD 64 void daemon_init() int I; pid_t pid; if ((pid = fork())!= 0) exit(0); setsid(): signal(sighup, SIG_IGN):

15 if ((Pid = fork())!= 0) exit(0): chdir( / ); umask(0); for (i=0; i<maxfd; i++) close(i); openlog(logname, LOG_PID, facility); 八 I/O 超时方法 1:alarm() 例如 : static void connect_alarm(int signo) return; signal(sigalarm, connect_alarm); if (alarm(timeout_sec)!=0) //error if (connect(sockfd, (struct sockaddr *)servaddr, servlen) < 0) close(sockfd); if (errno = EINTR) errno = ETIMEDOUT; alarm(0); 方法 2:select() 例如 : int readable_timeout(int fd, int sec) fd_set rset; struct timeval tv; FD_ZERO(&rset); FD_SET(fd, &rset): Tv.tv_sec = sec; Tv.tv_usec = 0; Return(select(fd+1, &rset, NULL, NULL, &tv)); sendto(sockfd, ); if (readable_timeout(sockfd, 5)==0)

16 //error else recvfrom(sockfd, ); // 可以读 方法 3:SO_RCVTIMEO 和 SO_SNDTIMEO 套接口选项例如 : struct timeval tv; tv.tv_sec=5; tv.tv_usec=0; setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)): while (fgets(sendline )!=NULL) sendto(sockfd, ); n=recvfrom(sockfd, ); if (n<0) if (errno == EWOULEBLOCK) fprintf(stderr, socket,timeout ); continue; else //error; 九 辅助数据的应用 可以运用于任何进程之间传递描述字的应用 sendmsg 和 recvmsg 可以用来传送辅助数据 ( 控制信息 ) 辅助数据由若干个辅助对象 组成, 每个辅助对象由一个 cmsghdr 结构开头 struct msghdr void *msg_name; // 用于 UDP 协议, 发送方可以存放目的地 址, 接收方可以存放发送地址 size_t msg_namelen; // 同上 struct iovec *msg_iov; // 输入输出缓冲区数据, 两个成员 iov_base 和 iov_len int msg_iovlen; void *msg_control; // 辅助数据 size_t msg_controllen; // 辅助数据大小 int msg_flags; // 只对 recvmsg 有用 ; Struct cmsghdr Socklen_t cmsg_len; Int cmsg_level; //IPV4 是 IPPROTO_IP,UNIX 域是 SOL_SOCKET Int Cmsg_type; // 在 IPV4 中,IP_RECVDSTADDR 接受 UDP 数据报的目的地址 //IP_RECVIF 接受 UDP 数据报的接口索引 //UNIX 域中是 SCM_RIGHTS 传送描述字 //SCM_CREDS 传送用户凭证

17 //char cmsg_data[]; msghdr.msg_control 指向的辅助数据必须按 cmsghdr 结构对齐 利用 UNIX 域 SOCKET 方式 : my_open(const char *pathname, int mode) int sockfd[2]; socketpair(af_local, SOCK_STREAM, 0, sockfd); // 创建了一个流管道 if ((childpid = fork()) == 0) // 子进程 close(socdfd[0]); snprintf(argsockfd, sizeof(argsocdfd), %d, sockfd[1]); snprintf(argmode, sizeof(mode), %d, mode); execl(./openfile, openfile, argsockfd, pathname, argmode, (char *)NULL); perror( exec error\n ); close(sockfd[1]);

18 waitpid(chidpid, &status, 0); if (WIFEXITED(status) == 0) perror( chid process did not terminate\n ); if ((status = WEXITSTATUS(status)) == 0) // 把终止状态转换为退出状态 read_fd(sockfd[0], &c, 1, &fd); else errno = status; fd = -1; close(sockdf[0]); return(fd); ssize_t read_fd(int fd, void *ptr, ssize_t nbytes, int *recvfd) struct msghdr msg; // 辅助数据对象 struct iovec iov[1]; union struct cmsghdr unit; // 这里定义辅助数据对象的目的是为了让 msg_control 缓冲区和辅助数据单元对齐, 所以不是简单地定义一个 char control[ ], 而是定义一个 union char control[cmsg_space(sizeof(int))]; // 辅助数据缓冲区 control_buf; struct cmsghdr *unitptr; int n; msg.msg_control = control_buf.control; // 辅助数据缓冲区 msg.msg_controllen = sizeof(control_buf.control); // 辅助数据大小 msg.msg_name = NULL; msg.msg_namelen = 0; iov[0].iov_base = ptr; iov[0].iov_len = nbytes; msg.msg_iov = iov; msg.msg_iovlen = 1; if ((n = recvmsg(fd, &msg, 0) <= 0) return(n); if ((unitptr = CMSG_FIRSTHDR(&msg)!= NULL && unitptr->cmsg_len == CMSG_LEN(sizeof(int))) //cmsg_len 应该 =CMSG_LEN 宏得出的结果 if (unitptr->cmsg_level!= SOL_SOCKET) //UNIX DOMAIN 用 SOL-SOCKET //error if (unitptr->cmsg_type!= SCM_RIGHTS) //error *recvd = *((int *)CMSG_DATA(unitptr)); // 获得该辅助对象的数据

19 else *recvd = -1; return(n); 子进程写程序摘录 : msg.msg_control = control_buf.control; msg.msg_controllen = sizeof(control_buf.control); unitprt = CMSG_FIRSTHDR(&msg); unitptr->cmsg_len = CMSG_LEN(sizeof(int)); unitptr->cmsg_level = SOL_SOCKET; unitptr->cmsg_level = SCM_RIGHTS; *((int *)CMSG_DATA(unitptr)) = sendfd; //CMSG_DATA() 返回与 cmsghdr 相关联的数据的第一个字节的指针 msg.msg_name = NULL; msg.msg_namelen = 0; iov[0].iov_base = ptr; iov[0].iov_len = nbytes; msg.msg_iov = iov; msg.msg_iovlen = 1; sendmsg(fd, &msg, 0); 用户凭证 #include <sys/ucred.h> struct fcred uid_t fc_ruid; // 真实 UID gid_t fc_rgid; // 真实 GID char fc_login[maxlogname]; //LOGIN 名字 uid_t fc_uid; // 有效 UID short fc_ngroups; // 组数 gid_t fc_groups[ngroups]; #define fc_gid fc_groups[0]; // 有效 GID 需要将 LOCAL _CREDS 这个 SOCKET 选项设置为 1, 在 TCP 中是 CLIENT 在连接后第一次发送数据时由内核一起发送的,UDP 是每次发送数据都产生 十 网络参数的设置和获取获得主机名存到 hostname 中 int gethostname(char *hostname, size_t size); 取得本地的 SOCKET 信息

20 int getsockname(int sockfd, struct sockaddr *addr, int *addrlen); 取得对方主机的 SOCKET 信息 int getpeername(int sockfd, struct sockaddr *addr, int *addrlen); 获得 DNS 信息 : struct hostent *gethostbyname(const char *name); struct hostent *gethostbyaddr(const char *addr, int len, int type); 返回了一个指向 struct hostent 的指针,struct hostent 定义如下 : struct hostent char *h_name; /* 主机域名 */ char **h_aliases; /* 别名 */ int h_addrtype; /* 地址类型 */ int h_length; /* IP 地址长度 */ char **h_addr_list; /* IP 地址链 */ ; #define h_addr h_addr_list[0] gethostbyname 通过设置 h_errno 代表出错号, 对应的错误函数有 hstrerror() 和 herror(), 分别对应于 strerror() 和 perror() 这两个普通的错误函数 获得或改变 socket 属性 int getsockopt(int sockfd, int level, int name, char *value, int *optlen); int setsockopt(int sockfd, int level, int name, char *value, int *optlen); level:( 级别 ): 指定选项代码的类型 SOL_SOCKET: 基本套接口 IPPROTO_IP: IPv4 套接口 IPPROTO_IPV6: IPv6 套接口 IPPROTO_TCP: TCP 套接口 level 一般为常数 SOL_SOCKET name 选项名称 value 选项值 : 是一个指向变量的指针, 变量可以是整形, 套接口结构, 其他结构类型 :linger, timeval optlen optval 的大小 常用选项的有 : [SOL_SOCKET] SO_BROADCAST 允许发送广播数据 int 适用於 UDP socket 其意义是允许 UDP socket 广播 (broadcast) 讯息到网路上 SO_DEBUG 允许调试 int SO_DONTROUTE 不查找路由 int SO_ERROR 获得套接字错误 int

21 SO_KEEPALIVE 保持连接 int 检测对方主机是否崩溃, 避免 ( 服务器 ) 永远阻塞于 TCP 连接的输入 设置该选项后, 如果 2 小时内在此套接口的任一方向都没有数据交换,TCP 就自动给对方发一个保持存活探测分节 (keepalive probe) 这是一个对方必须响应的 TCP 分节. 它会导致以下三种情况 : 对方接收一切正常 : 以期望的 ACK 响应 2 小时后,TCP 将发出另一个探测分节 对方已崩溃且已重新启动 : 以 RST 响应 套接口的待处理错误被置为 ECONNRESET, 套接口本身则被关闭 对方无任何响应 : 源自 berkeley 的 TCP 发送另外 8 个探测分节, 相隔 75 秒一个, 试图得到一个响应 在发出第一个探测分节 11 分钟 15 秒后若仍无响应就放弃 套接口的待处理错误被置为 ETIMEOUT, 套接口本身则被关闭 如 ICMP 错误是 host unreachable( 主机不可达 ), 说明对方主机并没有崩溃, 但是不可达, 这种情况下待处理错误被置为 EHOSTUNREACH SO_DONTLINGER 若为真, 则 SO_LINGER 选项被禁止 SO_LINGER 延迟关闭连接 struct linger 上面这两个选项影响 close 行为选项间隔关闭方式等待关闭与否 SO_DONTLINGER 不关心优雅否 SO_LINGER 零强制否 SO_LINGER 非零优雅是若设置了 SO_LINGER( 亦即 linger 结构中的 l_onoff 域设为非零, 参见 2.4,4.1.7 和 各节 ), 并设置了零超时间隔, 则 closesocket() 不被阻塞立即执行, 不论是否有排队数据未发送或未被确认 这种关闭方式称为 强制 或 失效 关闭, 因为套接口的虚电路立即被复位, 且丢失了未发送的数据 在远端的 recv() 调用将以 WSAECONNRESET 出错 若设置了 SO_LINGER 并确定了非零的超时间隔, 则 closesocket() 调用阻塞进程, 直到所剩数据发送完毕或超时 这种关闭称为 优雅的 关闭 请注意如果套接口置为非阻塞且 SO_LINGER 设为非零超时, 则 closesocket() 调用将以 WSAEWOULDBLOCK 错误返回 若在一个流类套接口上设置了 SO_DONTLINGER( 也就是说将 linger 结构的 l_onoff 域设为零 ; 参见 2.4,4.1.7, 节 ), 则 closesocket() 调用立即返回 但是, 如果可能, 排队的数据将在套接口关闭前发送 SO_OOBINLINE 带外数据放入正常数据流, 在普通数据流中接收带外数据 int SO_RCVBUF 接收缓冲区大小 int 设置接收缓冲区的保留大小与 SO_MAX_MSG_SIZE 或 TCP 滑动窗口无关, 如果一般发送的包很大很频繁, 那么使用这个选项 SO_SNDBUF 发送缓冲区大小 int 设置发送缓冲区的保留大小与 SO_MAX_MSG_SIZE 或 TCP 滑动窗口无关, 如果一般发送的包很大很频繁, 那么使用这个选项每个套接口都有一个发送缓冲区和一个接收缓冲区 接收缓冲区被 TCP 和 UDP 用来将接收到的数据一直保存到由应用进程来读 TCP:TCP 通告另一端的窗口大小 TCP 套接口接收缓冲区不可能溢出, 因为对方不允许发出超过所通告窗口大小的数据 这就是 TCP 的流量控制,

22 如果对方无视窗口大小而发出了超过宙口大小的数据, 则接收方 TCP 将丢弃它 UDP: 当接收到的数据报装不进套接口接收缓冲区时, 此数据报就被丢弃 UDP 是没有流量控制的 ; 快的发送者可以很容易地就淹没慢的接收者, 导致接收方的 UDP 丢弃数据报 SO_RCVLOWAT 接收缓冲区下限 int SO_SNDLOWAT 发送缓冲区下限 int 每个套接口都有一个接收低潮限度和一个发送低潮限度 它们是函数 selectt 使用的, 接收低潮限度是让 select 返回 可读 而在套接口接收缓冲区中必须有的数据总量 对于一个 TCP 或 UDP 套接口, 此值缺省为 1 发送低潮限度是让 select 返回 可写 而在套接口发送缓冲区中必须有的可用空间 对于 TCP 套接口, 此值常缺省为 2048 对于 UDP 使用低潮限度, 由于其发送缓冲区中可用空间的字节数是从不变化的, 只要 UDP 套接口发送缓冲区大小大于套接口的低潮限度, 这样的 UDP 套接口就总是可写的 UDP 没有发送缓冲区, 只有发送缓冲区的大小 SO_RCVTIMEO 接收超时 struct timeval SO_SNDTIMEO 发送超时 struct timeval SO_BROADCAST: 获得或设置 socket 状况, 使之可以广播发送数据报 ( 只能用于 UDP 方式 ) SO_REUSEADDR: 设置该 socket 绑定的端口可以被重用 注意 : 在 Linux 系统中, 如果一个 socket 绑定了某个端口, 该 socket 正常关闭或程序退出后, 在一段时间内该端口依然保持被绑定的状态, 其他程序 ( 或者重新启动的原程序 ) 无法绑定该端口 可以通过调用以下语句避免该问题 : opt = 1; len = sizeof(opt); setsockopt(sockfd,sol_socket,so_reuseaddr,&opt,&len); SO_EXCLUSIVEADDRUSE 独占模式使用端口, 就是不充许和其它程序使用 SO_REUSEADDR 共享的使用某一端口 在确定多重绑定使用谁的时候, 根据一条原则是谁的指定最明确则将包递交给谁, 而且没有权限之分, 也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的, 这是非常重大的一个安全隐患, 如果不想让自己程序被监听, 那么使用这个选 获得或改变 socket 的 I/O 属性 : int ioctl(int sockfd,long cmd,unsigned long* argp); cmd 属性类型,argp 属性的参数 常用的有 : FIONREAD, 返回 socket 缓冲区中未读数据的字节数 FIONBIO,argp 为零时为阻塞模式, 非零时为非阻塞模式 SIOCATMARK, 判断是否有未读的带外数据 ( 仅用于 TCP 协议 ), 返回 true 或 false int fcntl(int fd, int cmd, long arg); F_SETFL,arp 为 O_NONBLOCK 时进入非阻塞模式, 为 0 时进入阻塞模式 F_GETFL, 获得属性 调用 ioctl 获取系统网络接口的信息 :

23 struct ifconf int ifc_len; // 为 ifc_buf 缓冲区的大小 union caddr_t ifcu_buf; // 被定义为 ifc_buf, 用户定义传递到内核 struct ifreq *ifcu_req; // 被定义为 ifc_req, 内核返回到用户 ifc_ifcu; ; sturct ifreq char ifr_name[ifnamsiz]; // 网卡名字, 如 hme0,ifnamsiz=16 union struct sockaddr ifru_addr; // 定义为 ifr_addr, 主 IP 地址 ; struct sockaddr ifru_dstaddr; // 定义为 ifr_dstaddr; struct sockaddr ifru_broadaddr; // 定义为 ifr_broadaddr; short ifru_flags; // 定义为 ifr_flags, 参考 <net/if.h> int ifru_flags; // 定义为 ifr_flags int ifru_metric; // 定义为 ifr_metric caddr_t ifru_data; // 定义为 ifr_data ifr_ifru; 例子 :( 在 SOLARIS 环境下通过 ) 输入 IP 地址, 返回 MAC 地址 : #include <sys/types.h> #include <sys/sockio.h> #include <sys/param.h> #include <errno.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netdb.h> #include <sys/types.h> #include <unistd.h> #include <stropts.h> #include <net/if.h> #include <stdio.h> #include <sys/ioctl.h> #include <net/if_arp.h> int main(int argc, char **argv) int sockfd; char *ptr; struct arpreq arp; struct sockaddr_in *arptr;

24 sockfd = socket(af_inet, SOCK_STREAM, 0); //create any type of socket arptr = (struct sockaddr_in *)&arp.arp_pa; bzero(arptr, sizeof(struct sockaddr_in)); arptr->sin_family = AF_INET; arptr->sin_addr.s_addr = inet_addr(argv[1]); ioctl(sockfd, SIOCGARP, &arp); printf("addr = %s, arp mac = %x %x %x %x %x %x %x %x\n", inet_ntoa(arptr->sin_addr), arp.arp_ha.sa_data[0], arp.arp_ha.sa_da ta[1], arp.arp_ha.sa_data[2], arp.arp_ha.sa_data[3], arp.arp_ha.sa_data[4], arp.arp_ha.sa_data[5], arp.arp_ha.sa_data[6], arp.arp_ha.sa_data[7], arp.arp_ha.sa_data[8]); ptr = arp.arp_ha.sa_data; printf("mac = %x:%x:%x:%x:%x:%x\n", *(ptr)&0xff, *(ptr+1)&0xff, *(ptr+2)&0xff, *(ptr+3)&0xff, *(ptr+4)&0xff, *(ptr+5)&0xff); 根据网卡名字输出 MAC 地址 : #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <netinet/in.h> #include <net/if.h> #include <net/if_arp.h> #include <arpa/inet.h> #include <errno.h> #include <sys/sockio.h> #define ETH_NAME "eri0" int main() int sock; struct sockaddr_in sin; struct ifreq ifr; sock = socket(af_inet, SOCK_DGRAM, 0); if (sock == -1) perror("socket"); return -1; strncpy(ifr.ifr_name, ETH_NAME, IFNAMSIZ);

25 ifr.ifr_name[ifnamsiz - 1] = 0; if (ioctl(sock, SIOCGIFADDR, &ifr) < 0) perror("ioctl"); return -1; memcpy(&sin, &ifr.ifr_addr, sizeof(sin)); fprintf(stdout, "hme0: %s\n", inet_ntoa(sin.sin_addr)); return 0; 输出当前系统所有 UP 状态的网络接口的 IP 地址,MAC 地址等信息 #include <sys/types.h> #include <sys/sockio.h> #include <sys/param.h> #include <errno.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netdb.h> #include <sys/types.h> #include <unistd.h> #include <stropts.h> #include <net/if.h> #include <stdio.h> #include <sys/ioctl.h> #include <net/if_arp.h> #define INTERFACE_NUM 5 struct my_inte char inte_name[16]; char mac[8]; short mac_len; short flags; struct sockaddr primary_addr; struct sockaddr broad_addr; struct sockaddr dest_addr; struct sockaddr netmask; struct my_inet *next; ;

26 void list(struct my_inte* ptr) struct sockaddr_in *addr; printf("inteface_name = %s\n", ptr->inte_name); printf("mac = %x:%x:%x:%x:%x:%x\n", *(ptr->mac)&0xff, *(ptr->mac+1)&0xff, *(ptr->mac+2)&0xff, *(ptr->mac+3)&0xff, *(ptr->mac +4)&0xff, *(ptr->mac+5)&0xff); printf("flags = %d ", ptr->flags); if (ptr->flags & IFF_UP) printf("up "); if (ptr->flags & IFF_BROADCAST) printf("broadcast "); if (ptr->flags & IFF_MULTICAST) printf("multicast "); if (ptr->flags & IFF_LOOPBACK) printf("loopback "); if (ptr->flags & IFF_POINTOPOINT) printf("point to point "); printf("\n"); addr = (struct sockaddr_in*)&ptr->primary_addr; printf("primary_addr = %s\n", inet_ntoa(addr->sin_addr)); addr = (struct sockaddr_in*)&ptr->netmask; printf("netmask = %s\n", inet_ntoa(addr->sin_addr)); addr = (struct sockaddr_in*)&ptr->broad_addr; printf("broad_addr = %s\n", inet_ntoa(addr->sin_addr)); addr = (struct sockaddr_in*)&ptr->dest_addr; printf("dest_addr = %s\n\n", inet_ntoa(addr->sin_addr)); int main(int argc, char **argv) int sockfd, len, lastlen, flags; char *buf, *ptr; struct ifconf interfaces; struct ifreq *inteptr, intecopy; struct my_inte *head, *tail, *my_inte_ptr, *tmpptr; struct arpreq arp; struct sockaddr_in *arptr; sockfd = socket(af_inet, SOCK_STREAM, 0); //create any type of socket lastlen = 0; len = INTERFACE_NUM * sizeof(struct ifreq); for (;;) buf = (char *)malloc(len); interfaces.ifc_len = len; interfaces.ifc_buf = buf;

27 if (ioctl(sockfd, SIOCGIFCONF, &interfaces) < 0) if (errno!= EINVAL lastlen!= 0) //if return EINVAL and not return succeed perror("ioctl error"); return; else if (interfaces.ifc_len == lastlen) break; lastlen = interfaces.ifc_len; len += INTERFACE_NUM * sizeof(struct ifreq); free(buf); head = tail = NULL; for (ptr = buf; ptr < buf + interfaces.ifc_len; ) inteptr = (struct ifreq *)ptr; ptr += sizeof(inteptr->ifr_name) + sizeof(struct sockaddr); //ptr pioint to next ifreq struct intecopy = *inteptr; ioctl(sockfd, SIOCGIFFLAGS, &intecopy); flags = intecopy.ifr_flags; if (flags & IFF_UP == 0) //ignore down network card continue; my_inte_ptr = (struct my_inte_ptr*)calloc(1, sizeof(struct my_inte)); //create a self-defined struct my_inte_ptr->next = NULL; my_inte_ptr->flags = flags; bzero(&(my_inte_ptr->inte_name), 16); strncpy(my_inte_ptr->inte_name, inteptr->ifr_name, 16-1); memcpy(&my_inte_ptr->primary_addr, &(*inteptr).ifr_addr, sizeof(struct sockaddr)); //IP addr arptr = (struct sockaddr_in *)&arp.arp_pa; bzero(arptr, sizeof(struct sockaddr_in)); arptr->sin_family = AF_INET; arptr->sin_addr = ((struct sockaddr_in *)(&my_inte_ptr->primary_addr))->sin_addr; ioctl(sockfd, SIOCGARP, &arp);

28 printf("addr = %s, arp mac = %x %x %x %x %x %x %x %x\n", inet_ntoa(arptr->sin_addr), arp.arp_ha.sa_data[0], arp.arp_ha.sa_da ta[1], arp.arp_ha.sa_data[2], arp.arp_ha.sa_data[3], arp.arp_ha.sa_data[4], arp.arp_ha.sa_data[5], arp.arp_ha.sa_data[6], arp.arp_ha.sa_data[7], arp.arp_ha.sa_data[8]); memcpy(my_inte_ptr->mac, arp.arp_ha.sa_data, 8); //MAC ioctl(sockfd, SIOCGIFNETMASK, &intecopy); my_inte_ptr->netmask = intecopy.ifr_addr; if (flags & IFF_BROADCAST) ioctl(sockfd, SIOCGIFBRDADDR, &intecopy); my_inte_ptr->broad_addr = intecopy.ifr_broadaddr; if (flags & IFF_POINTOPOINT) ioctl(sockfd, SIOCGIFDSTADDR, &intecopy); my_inte_ptr->dest_addr = intecopy.ifr_dstaddr; if (head == NULL) head = tail = my_inte_ptr; else tail->next = my_inte_ptr; free(buf); //list the list for (my_inte_ptr = head; my_inte_ptr!= NULL; ) tmpptr = my_inte_ptr; my_inte_ptr= my_inte_ptr->next; list(tmpptr); free(tmpptr); ARP 高速缓存 : 由 ioctl 维护 stuct arpreq struct sockaddr apr_pa;//ip 地址 struct sockaddr arp_ha;//mac 地址 int arp_flags;

29 相关的操作有 : 1. SIGCSARP: 增加或修改一个 ARP 高速缓冲区的条目 2. SIGCDARP: 删除一个条目 3. SIGCGARP: 取出一个条目 路由套接口 : 通过路由套接口交换的结构有 3 种 : 1. Struct rt_msghdr U_short rtm_msglen;// 消息长度, 包括头和其后的 SOCKET 地址结构 U_char rtm_version; U_char rtm_type; // 操作类型, 如 RTM_GET U_short rtm_index; int rtm_flags; int rtm_addrs; // 位掩码, 如 RTA_DST, 表示头结构后的 SOCKET 地址结构的类型 pid_t rtm_pid; int rtm_seq; int rtm_errno; int rtm_inits; struct rt_metrics rtm_rmx; 2. Struct if_msghdr 3. Struct ifa_msghdr 以上消息结构由用户填写部分信息发往内核, 返回的数据在 struct _msghdr 结构之后将最多有 8 个 SOCKET 结构, 为 :DST GATEWAY NETMASK GENMASK IFP IFR AUTHOR BRD 套接字结构 十一 十二 十三 ( 待续 )

ebook35-21

ebook35-21 21 Linux L i n u x 211 U N I X U N I X I / O F I F O U N I X I n t e r n e t s o c k e t () s o c k e t () send() r e c v ( read() w r i t e () send() r e c v () I n t e r n e t 212 Internet Internet S

More information

工程硕士信息通信网实验讲义.doc

工程硕士信息通信网实验讲义.doc 1 Linux 1.1 Linux 1.1.1 Linux 1.1.2 Linux Linux --help arp help manual manual TCP/IP ARPIP RFC1812 2.2.3 IPV4 IPv6 RFC ftp 1.1.3 1 ARP ip addr show up eth0 IP ip neigh show ARP VLAN VLAN IP Ping ICMP echo

More information

网络程序设计(socketAPI)

网络程序设计(socketAPI) 前言通信模型重要函数 网络程序设计 (socketapi) 孙永科 西南林业大学 2010 年 9 月 6 日 1 / 40 上节回顾 前言通信模型重要函数上节回顾本章重点 阻塞和非阻塞 socket 通信模型大字节顺序小字节顺序网络字节顺序 2 / 40 本章重点 前言通信模型重要函数上节回顾本章重点 1 通信模型基本概念 Socket 通信 Socket 地址 Socket 函数 2 重要函数获取主机信息

More information

下表所示, 此时 protocol 参数可使用缺省值 0 ; 但如果还有多个协议供选择, 则必须使用 protocol 参数来标识 协议族 ( 仅考虑 IP 协议 传送类型 protocol 参数常量 协议类型 族 ) (/usr/include/linux/in.h) SOCK_STREAM IP

下表所示, 此时 protocol 参数可使用缺省值 0 ; 但如果还有多个协议供选择, 则必须使用 protocol 参数来标识 协议族 ( 仅考虑 IP 协议 传送类型 protocol 参数常量 协议类型 族 ) (/usr/include/linux/in.h) SOCK_STREAM IP 实验 2 参考资料 Linux/Unix:Socket 函数库 Linux Socket 函数库是从 Berkeley 大学开发的 BSD UNIX 系统中移植过来的 BSD Socket 接口是在众多 Unix 系统中被广泛支持的 TCP/IP 通信接口,Linux 下的 Socket 程序设计, 除了微小的差别之外, 也适用于大多数其它 Unix 系统 Socket 的使用和文件操作比较类似 如同文件的读

More information

前言 UDP 基础通信实例广播和多播思考练习本章重点. 本章重点...1 UDP 基础通信模型 UDP 常用函数...2 通信实例通信模式 1 通信模式 2 UDP 与多进程...3 广播和多播广播多播...4 思考练习. 2 / 56

前言 UDP 基础通信实例广播和多播思考练习本章重点. 本章重点...1 UDP 基础通信模型 UDP 常用函数...2 通信实例通信模式 1 通信模式 2 UDP 与多进程...3 广播和多播广播多播...4 思考练习. 2 / 56 前言 UDP 基础通信实例广播和多播思考练习.... 网络程序设计 (UDP).. 孙永科 西南林业大学 2010 年 8 月 21 日 1 / 56 前言 UDP 基础通信实例广播和多播思考练习本章重点. 本章重点...1 UDP 基础通信模型 UDP 常用函数...2 通信实例通信模式 1 通信模式 2 UDP 与多进程...3 广播和多播广播多播...4 思考练习. 2 / 56 前言 UDP

More information

Chapter 5- 运输层 (5)-2017

Chapter 5- 运输层 (5)-2017 计算机网络 运输层编程 (5) 陈旺虎 chenwh@nwnu.edu.cn Review TCP 协议格式 TCP 可靠传输 为什么需要三次握手? A 发送一次确认的原因 应对出现 已失效的连接请求报文段 的情况, 即防止已失效的连接请求报文段突然又传到了 B 例 1:A 发出连接请求, 但该请求丢失,A 重传连接请求, 到达 B, 则正常 ; 一. 认识 Socket 应用层程序 流套接字接口

More information

Chapter #

Chapter # 第三章 TCP/IP 协议栈 本章目标 通过本章的学习, 您应该掌握以下内容 : 掌握 TCP/IP 分层模型 掌握 IP 协议原理 理解 OSI 和 TCP/IP 模型的区别和联系 TCP/IP 介绍 主机 主机 Internet TCP/IP 早期的协议族 全球范围 TCP/IP 协议栈 7 6 5 4 3 应用层表示层会话层传输层网络层 应用层 主机到主机层 Internet 层 2 1 数据链路层

More information

PowerPoint Presentation

PowerPoint Presentation 网络编程简介 授课老师 : 赵增华助教 : 杨金峰邮件 : myjfm@163.com 两台计算机通过网络进行通信 端口 端口 A 协议 网络 协议 B 192.168.0.118 192.168.0.10 IP 地址 IP 网络中每台主机都必须有一个惟一的 IP 地址 ; IP 地址是一个逻辑地址 ; 因特网上的 IP 地址具有全球唯一性 ; 32 位, 4 个字节, 常用点分十进制的格式表示,

More information

VoIP Make a Rtp Call VoIP Abstract... 2 VoIP RTP...3 Socket IP...9 Config Two Voice-hub

VoIP Make a Rtp Call VoIP Abstract... 2 VoIP RTP...3 Socket IP...9 Config Two Voice-hub VoIP... 2... 2 Abstract... 2... 3... 3 RTP...3 Socket...4...6...7 IP...9 Config Two Voice-hub... 10 1 12 VoIP VoIP voice-hub voice-hub Abstract At the beginning of this paper, we introducted the essential

More information

Slide 1

Slide 1 网络编程入门篇 Select: 非阻塞 Socket 编程 目录 基础知识 具体示例 注意事项 示例代码讲解 基础知识 基础知识 在 RT-Thread 使用 socket 网络编程时, 由于 socket 的 recv 和 send 的实现是阻塞式的, 因此当一个任务调用 recv() 函数接收数据时, 如果 socket 上并没有接收到数据, 这个任务将阻塞在 recv() 函数里 这个时候,

More information

嵌入式Linux块设备驱动开发解析

嵌入式Linux块设备驱动开发解析 The success's road 嵌 入 式 LINUX 网 络 驱 动 开 发 Copyright 2007-2008 Farsight. All rights reserved. 要 点 Linux 网 络 设 备 驱 动 程 序 概 述 计 算 机 网 络 概 述 skbuf 数 据 结 构 介 绍 Linux 网 络 设 备 驱 动 程 序 API 介 绍 Linux 网 络 设 备 驱

More information

华清远见就业优势倍增项目手册

华清远见就业优势倍增项目手册 Linux 网络编程 曾宏安 1. Internet 与 TCP/IP 协议 1 2 3 4 Internet 历史 OSI 模型与 TCP/IP 协议体系结构 TCP/IP 协议 TCP 和 UDP 协议 Internet 的历史 } Internet- 冷战 的产物 } 1957 年 10 月和 11 月, 前苏联先后有两颗 Sputnik 卫星上天 } 1958 年美国总统艾森豪威尔向美国国会提出建立

More information

Linux網路傳輸設定

Linux網路傳輸設定 Linux 網路傳輸設定 南台科技大學電子系 指導老師 : 侯安桑 班級 : 電子碩研一甲 學號 :M9830205 姓名 : 張嘉巖 Android 網路傳輸設定已經完成後, 接下來要開始設定 linux 網路傳輸, 目標是要將 linux 當作 server 端來設計, 使用的程式語言為 C 語言, 此作法會比 android 來的簡單許多, 只要顧慮程式流程和邏輯觀念是否正確即可, 下面會介紹

More information

Ps22Pdf

Ps22Pdf Linux/ U NIX L in u x ( ) 158,,,,,, : 5, ( socket ) I/ O I/ O Inetd, U NIX/ L inux,,, UNIX/ Linux UNIX/ Linux 5, 5,, : Linux : : (, 100084) ht tp: / / w ww. tup. tsinghua. edu. cn : : : 7871092 1/ 16:

More information

Slide 1

Slide 1 网络编程入门篇 利用 socket 实现 TCP 服务器 目录 基础知识 具体示例 示例代码讲解 基础知识 基础知识 socket 编程一般采用客户端 - 服务器模式 ( 即由客户进程向服务器进程发出请求, 服务器进程执行请求的任务并将执行结果返回给客户进程的模式 ) 今天我们要讲的就是如何利用 socket 编程实现基于 TCP 协议通信的服务器 首先我们先向大家展示 socket 编程的流程,

More information

Chap04

Chap04 Socket 编程介绍 Socket Socket 网络编程 按照操作系统 Windows 的 socket 编程 *nix 的 socket 编程 按照编程语 言 使 用C++ Java 的 socket 编程 使 用脚本语 言的 socket 编程 Socket 的 一些历史 Sockets 本来是 UNIX 操作系统下流 行行的 一种 网络编程接 口 (API), 在 4.2 BSD 中被 首先引

More information

Microsoft PowerPoint - Socket programming.ppt [相容模式]

Microsoft PowerPoint - Socket programming.ppt [相容模式] Basic Concept of Socket Socket programming 位於傳輸層和應用層之間 socket 是一種可做雙向資料傳輸的通道 讓應用層可以傳送資料給 socket, 或是從 socket 接收資料 Jimmy 2011/3/29 Concept of Socket Relation between Socket and Application Socket 的概念和檔案代碼觀念相似,

More information

ebook15-12

ebook15-12 1 2I / O 12.1 I / O V I / O s e l e c tp o l l r e a d vw r i t e v I / Om m a p 14 15 12.2 I / O 1 0. 5 F I F O F I F O i o c t l 14 I / O I / o p e n, r e a dw r i t e I / O (1) o p e n O _ N O N B L

More information

untitled

untitled Lwip Swedish Institute of Computer Science February 20, 2001 Adam Dunkels adam@sics.se (QQ: 10205001) (QQ: 329147) (QQ:3232253) (QQ:3232253) QQ ARM TCPIP LCD10988210 LWIP TCP/IP LWIP LWIP lwip API lwip

More information

图 4.2 udpclient 项目解决方案 3. 客户机程序编码如下 : 程序 : udp 客户机程序 udpclient.cpp

图 4.2 udpclient 项目解决方案 3. 客户机程序编码如下 : 程序 : udp 客户机程序 udpclient.cpp 实验四 UDP 客户机和服务器设计 一 实验目的 1. 学习和理解 UDP 协议 ( 对照 TCP 协议 ) 2. 掌握 UDP 客户机与服务器程序的设计方法 3. 掌握 UDP 套接字创建方法, 掌握 sendto recvfrom 等函数用法 注意与 send recv 函数做对比性学习 二 实验内容 1. 完成发送和接收数据报的客户机设计 2. 完成接收和回送数据报的服务器设计 3.( 选做

More information

ebook15-C

ebook15-C C 1 1.1 l s ( 1 ) - i i 4. 14 - d $ l s -ldi /etc/. /etc/.. - i i 3077 drwxr-sr-x 7 bin 2048 Aug 5 20:12 /etc/./ 2 drwxr-xr-x 13 root 512 Aug 5 20:11 /etc/../ $ls -ldi /. /..... i 2 2 drwxr-xr-x 13 root

More information

引言 ftp 工作原理 FTP 客户端思考练习 要点回顾 1 ip 地址结构 2 字节顺序转换函数 3 IP 格式转换函数 2 / 29

引言 ftp 工作原理 FTP 客户端思考练习 要点回顾 1 ip 地址结构 2 字节顺序转换函数 3 IP 格式转换函数 2 / 29 引言 ftp 工作原理 FTP 客户端思考练习 网络程序设计 (FTP) 孙永科 西南林业大学 2010 年 9 月 17 日 1 / 29 引言 ftp 工作原理 FTP 客户端思考练习 要点回顾 1 ip 地址结构 2 字节顺序转换函数 3 IP 格式转换函数 2 / 29 引言 ftp 工作原理 FTP 客户端思考练习 本节重点 1 ftp 工作原理数据分析 TCPdump 过程分析 wireshark

More information

Title Unassigned.

Title Unassigned. 基本操作流程 用 usock 函数编写 TCP 客户端程序 usock_open 用 usock_open 获取一个 usock 描述符 usock_connect 用刚才返回的描述符进行 connect 操作 connect 时指定的对方地址用 usockaddr_in 结构体描述 usock_write 用 usock_write 写数据给对方, 用 usock_read 读取对方发来的数据 usock_read

More information

Basics of Socket Programming Please check the referenced links for the further description and examples. 1 Procedures for Socket Implementation 1. Create the server application (e.g. a simple shellscript)

More information

ebook15-10

ebook15-10 1 0 10.1 U N I X V 7 4. 3 B S D S V R 3 P O S I X. 1 100 % 10.2 S I G S I G A B RT a b o r t S I G A L R M a l a r m V 7 1 5 S V R 4 4. 3 + B S D 31 < s i g n a l. h > 0 10. 9 k i l l 0 P O S I X. 1 D

More information

/ / (FC 3)...

/ / (FC 3)... Modbus/TCP 1.0 1999 3 29 Andy Swales Schneider aswales@modicon.com ... 2 1.... 3 2.... 3 2.1.. 3 2.2..4 2.3..4 2.4... 5 3.... 5 3.1 0... 5 3.2 1... 5 3.3 2... 6 3.4 / /... 7 4.... 7 5.... 8 5.1 0... 9

More information

Linux网络编程socket错误分析

Linux网络编程socket错误分析 Linux 网 络 编 程 socket 错 误 分 析 socket 错 误 码 : EINTR: 4 阻 塞 的 操 作 被 取 消 阻 塞 的 调 用 打 断 如 设 置 了 发 送 接 收 超 时, 就 会 遇 到 这 种 错 误 只 能 针 对 阻 塞 模 式 的 socket 读, 写 阻 塞 的 socket 时,-1 返 回, 错 误 号 为 INTR 另 外, 如 果 出 现 EINTR

More information

它是使用标准 Unix 文件描述符 (file descriptor) 和其它程序通讯的方式 什么? 你也许听到一些 Unix 高手 (hacker) 这样说过 : 呀,Unix 中的一切就是文件!. 那个家伙也许正在说到一个事实 :Unix 程序在执行任何形式的 I/O 的时候, 程序是在读或者写

它是使用标准 Unix 文件描述符 (file descriptor) 和其它程序通讯的方式 什么? 你也许听到一些 Unix 高手 (hacker) 这样说过 : 呀,Unix 中的一切就是文件!. 那个家伙也许正在说到一个事实 :Unix 程序在执行任何形式的 I/O 的时候, 程序是在读或者写 C 语言 SOCKET 编程入门 ( 第二版 ) (2017 年 6 月 8 日 14:29:11) 1 一切才刚刚开始 socket 编程让你沮丧吗? 从 man pages 中很难得到有用的信息吗? 你想跟上时代 去编写 Internet 相关的程序, 但是为你在调用 connect() 前的 bind() 的结构而不知所 措? 等等... 好在已经将这些事完成了, 这里将和所有人分享所知道的知识了

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

《 计 算 机 网 络 》

《 计 算 机 网 络 》 1 ... 5 1.1... 5 1.2... 5 1.3... 5 1.4... 6 BOSON NETSIM...11 2.1... 11 2.2... 11 2.3 BOSON NETSIM... 27 CISCO... 31 3.1... 31 3.2 IP... 33 3.3... 34... 36 4.1... 36 4.2... 41 4.3... 47 Socket 2 ... 50

More information

C6_ppt.PDF

C6_ppt.PDF C01-202 1 2 - (Masquerade) (Replay) (Message Modification) (Denial of Service) - ( ) (Eavesdropping) (Traffic Analysis) 8 1 2 7 3 6 5 4 3 - TCP SYN (SYN flood) Smurf Ping of Death LAND Attack Teardrop

More information

24 数据包 Sockets 阻塞 select()-- 多路同步 I/O 重新回顾 TCP,UDP 47 4 什么是 socket 你经常听到人们谈论着 socket, 或许你还不知道它的确切含义 现在让我告诉你 : 它是使用标准 Unix 文件描述符 (fi

24 数据包 Sockets 阻塞 select()-- 多路同步 I/O 重新回顾 TCP,UDP 47 4 什么是 socket 你经常听到人们谈论着 socket, 或许你还不知道它的确切含义 现在让我告诉你 : 它是使用标准 Unix 文件描述符 (fi C 语言 SOCKET 编程指南 (2016 年 1 月 7 日 14:58:21) 1 介绍 Socket 编程让你沮丧吗? 从 man pages 中很难得到有用的信息吗? 你想跟上时代去编 Internet 相关的程序, 但是为你在调用 connect() 前的 bind() 的结构而不知所措? 等等 好在我已经将这些事完成了, 我将和所有人共享我的知识了 如果你了解 C 语言并想穿过网络编程的沼泽,

More information

Chap06

Chap06 基于 TCP 与 UDP 的服务器器端 / 客户端程序开发 基于 TCP 的 C/S 程序 - 服务器器端分析 Client Server listen() 的 工作过程 调 用 listen() 函数进 入等待连接请求状态 在 listen() 之后, 客户端的 connect() 调 用才有作 用 listen(int sock, int backlog) 成功返回 0, 失败返回 -1 listen():

More information

Simulator By SunLingxi 2003

Simulator By SunLingxi 2003 Simulator By SunLingxi sunlingxi@sina.com 2003 windows 2000 Tornado ping ping 1. Tornado Full Simulator...3 2....3 3. ping...6 4. Tornado Simulator BSP...6 5. VxWorks simpc...7 6. simulator...7 7. simulator

More information

第6章 嵌入式Linux网络编程

第6章 嵌入式Linux网络编程 第 6 章嵌入式 Linux 网络编程 本章目标本章主要介绍嵌入式 Linux 网络编程的基础知识 由于网络在嵌入式中的应用非常广泛, 基本上常见的应用都会与网络有关, 因此, 掌握这一部分的内容是非常重要的, 学习完本章读者将掌握如下内容 TCP/IP 协议概述网络基础编程网络高级编程 NTP 客户端的实现 6.1. TCP/IP 协议概述 6.1.1TCP/IP 的分层模型读者一定都听说过著名的

More information

Chap6.ppt

Chap6.ppt Computer Networks v4 cs.sjtu 12/21/12 6 Internet ftp://ftp.cs.sjtu.edu.cn/ybzhang 61 / 110 Computer Networks v4 cs.sjtu 12/21/12 ftp://ftp.cs.sjtu.edu.cn/ybzhang 62 / 110 Computer Networks v4 cs.sjtu 12/21/12

More information

Microsoft PowerPoint - µÚ5.7½Ú VxWorksÍøÂç±à³Ì[³Ìʤ].ppt

Microsoft PowerPoint - µÚ5.7½Ú VxWorksÍøÂç±à³Ì[³Ìʤ].ppt 5.7 VxWorks 网络编程 1. VxWorks 虚拟网卡应用 2. VxWorks 网络概述 3. VxWorks 网络程序设计 4. 远程访问服务 1. VxWorks 网络应用示例 VxWorks 全仿真 安装 ULIP 虚拟网卡 VxSim 网卡的配置 TFTP 示例演示 北京邮电大学培训中心 http://www.bupttc.com 1 北京邮电大学培训中心 http://www.bupttc.com

More information

Microsoft PowerPoint - os_4.ppt

Microsoft PowerPoint - os_4.ppt 行 程 資 科 系 林 偉 川 行 程 概 念 行 程 與 程 式 主 要 的 不 同 點 : 程 式 是 被 放 在 外 部 的 儲 存 裝 置 如 磁 碟 上, 而 行 程 則 被 放 在 記 憶 體 中 程 式 在 儲 存 裝 置 中 是 靜 態 的, 而 行 程 在 記 憶 體 中 是 動 態 的, 它 會 隨 著 一 些 事 件 的 發 生 而 產 生 相 對 的 改 變 行 程, 就 是

More information

ACE

ACE ACE Socket Allen Long ihuihoo@gmail.com http://www.huihoo.com huihoo - Enterprise Open Source 内容安排 如何访问 OS 服务 TCP/IP Socket 编程接口 使用 ACE 的 UDP 类进行网络编程 单播 广播 多播 Socket Interface 3 Socket API 概述 (1/2) Sockets

More information

untitled

untitled 1 DBF (READDBF.C)... 1 2 (filetest.c)...2 3 (mousetes.c)...3 4 (painttes.c)...5 5 (dirtest.c)...9 6 (list.c)...9 1 dbf (readdbf.c) /* dbf */ #include int rf,k,reclen,addr,*p1; long brec,erec,i,j,recnum,*p2;

More information

Microsoft Word - 第5章.doc

Microsoft Word - 第5章.doc 第 5 章 网络通信 所谓通信, 是指将一个实体 ( 信源 ) 的信息传送给另一实体 ( 信宿 ) 的具体实现 参与通信的两个实体之间通过信道连接并传递信息 信道有物理信道和逻辑信道之分, 物理信道是指用来传送信号或数据的物理通路, 它由传输介质及相关通信设备组成 ; 而逻辑信道则是信息的逻辑通路, 其特性决定了双方通信的类型 物理信道可以支持多种逻辑信道, 而每一种逻辑信道只允许使用一种通信类型

More information

《信息通信网》实验指导书

《信息通信网》实验指导书 IPv6 网络基础编程 一 实验目的 学习网络套接口 (socket) 编程, 掌握 Linux 操作系统下使用 TCP 协议进行通信的 IPv6 网络应用程序基本实现框架, 加深对 IPv6 协议的理解 二 预备工作和实验要求 将纯 IPv4 网络应用程序移植到纯 IPv6 环境下并没有多大困难 ; 对于典型的 C/S 结构程序, 我们只需对客户端和服务器端源代码进行简单修改, 然后重新编译它们

More information

C 1

C 1 C homepage: xpzhangme 2018 5 30 C 1 C min(x, y) double C // min c # include # include double min ( double x, double y); int main ( int argc, char * argv []) { double x, y; if( argc!=

More information

华恒家庭网关方案

华恒家庭网关方案 LINUX V1.5 1 2 1 2 LINUX WINDOWS PC VC LINUX WINDOWS LINUX 90% GUI LINUX C 3 REDHAT 9 LINUX PC TFTP/NFS http://www.hhcn.com/chinese/embedlinux-res.html minicom NFS mount C HHARM9-EDU 1 LINUX HHARM9-EDU

More information

Microsoft Word - Winsock網路程式設計.doc

Microsoft Word - Winsock網路程式設計.doc 網路程式設計 (WinSock) 一 簡介 個人電腦及微軟視窗已經非常普遍, 加上利用電腦網路的種種好處, 有不少廠商在這樣的環境下開發一些給使用者使用的軟體 ( 如 Telnet FTP News Mail 等等 ) 或是提供網路發展環境給使用者來開發其網路軟體 但是早期發展時, 由於沒有共同的標準介面, 所以各家廠商均各自發展其環境系統及應用軟體 ; 使用者在購買了這樣的一套系統之後, 不論是使用其應用軟體或是在上面開發自己的程式都必須受限於這家廠商了,

More information

static struct file_operations gpio_ctl_fops={ ioctl: gpio_ctl_ioctl, open : gpio_open, release: gpio_release, ; #defineled1_on() (GPBDAT &= ~0x1) #def

static struct file_operations gpio_ctl_fops={ ioctl: gpio_ctl_ioctl, open : gpio_open, release: gpio_release, ; #defineled1_on() (GPBDAT &= ~0x1) #def Kaise s 2410 Board setting [1]. Device Driver Device Driver Linux s Kernel ARM s kernel s3c2410_kernel2.4.18_r1.1_change.tar.bz2 /usr/src (1) #cd /usr/src (2) #tar xfj s3c2410_kernel2.4.18_r1.1_change.tar.bz2

More information

Web

Web Email: tian@dr.com http://www.digiark.com/tian Web 1. 2. 3. 4. 5. 6. Internet Internet (Hacker) Internet web IP 1 Internet UNIX Windows VLAN Internet IP 2 Internet FTP TELNET PING IP 8 telnet FTP RLOGIN

More information

附录一 简明Socket编程指南

附录一 简明Socket编程指南 附录一简明 Socket 编程指南 在本说明文档中, 主要讲述了一些网络 SOCKET 编程的基本概念和有关函数说明, 并 给出了部分示例程序的源代码 在完成 TCP 和 IP 通信程序设计实验 实时声音传输实 验 和 HTTP 代理实现实验 时, 可以参考本文档的内容 一 SOCKET 基本概念 1 Linux/Unix:Socket 函数库 Linux Socket 函数库是从 Berkeley

More information

UDP 8.2 TCP/IP OSI OSI 3 OSI TCP/IP IP TCP/IP TCP/IP Transport Control Protocol TCP User Datagram Protocol UDP TCP TCP/IP IP TCP TCP/IP TC

UDP 8.2 TCP/IP OSI OSI 3 OSI TCP/IP IP TCP/IP TCP/IP Transport Control Protocol TCP User Datagram Protocol UDP TCP TCP/IP IP TCP TCP/IP TC 8 TCP/IP TCP/IP TCP OSI 8.1 OSI 4 end to end A B FTP OSI Connection Management handshake Flow Control Error Detection IP Response to User s Request TCP/IP TCP 181 UDP 8.2 TCP/IP OSI OSI 3 OSI 3 8.1 TCP/IP

More information

新・明解C言語入門編『索引』

新・明解C言語入門編『索引』 !... 75!=... 48 "... 234 " "... 9, 84, 240 #define... 118, 213 #include... 148 %... 23 %... 23, 24 %%... 23 %d... 4 %f... 29 %ld... 177 %lf... 31 %lu... 177 %o... 196 %p... 262 %s... 242, 244 %u... 177

More information

(Methods) Client Server Microsoft Winsock Control VB 1 VB Microsoft Winsock Control 6.0 Microsoft Winsock Control 6.0 1(a). 2

(Methods) Client Server Microsoft Winsock Control VB 1 VB Microsoft Winsock Control 6.0 Microsoft Winsock Control 6.0 1(a). 2 (2005-01-26) (2005-01-26) (2005-02-27) PIC_SERVER (9) VB TCP/UDP Visual Basic Microsoft Winsock Control (MSWINSCK.OCX) UDP TCP Client Server Visual Basic UDP/TCP PIC_SERVER UDP/TCP 1. Microsoft Winsock

More information

How to Debug Tuxedo Server printf( Input data is: %s, inputstr); fprintf(stdout, Input data is %s, inputstr); fprintf(stderr, Input data is %s, inputstr); printf( Return data is: %s, outputstr); tpreturn(tpsuccess,

More information

epub 33-8

epub 33-8 8 1) 2) 3) A S C I I 4 C I / O I / 8.1 8.1.1 1. ANSI C F I L E s t d i o. h typedef struct i n t _ f d ; i n t _ c l e f t ; i n t _ m o d e ; c h a r *_ n e x t ; char *_buff; /* /* /* /* /* 1 5 4 C FILE

More information

Iinux中select函数的使用

Iinux中select函数的使用 Iinux 中 select 函数的使用 阻塞式 I/O 编程有两个特点 : 一 如果一个发现 I\O 有输入, 读取的过程中, 另外一个也有了输入, 这时候不会产生任何反应, 也就是需要你的程序语句去 select 的时候才知道有数据输入 二 程序去 select 的时候, 如果没有数据输入, 程序会一直等待, 直到有数据位置, 也就是程序中无需循环和 sleep Select 在 Socket

More information

(Microsoft Word - socket\312\265\321\351\262\316\277\274.doc)

(Microsoft Word - socket\312\265\321\351\262\316\277\274.doc) UNIX 系统的 I/O 命令集, 是从 Maltics 和早期系统中的命令演变出来的, 其模式为打开 一读 / 写一关闭 (open-write-read-close) 在一个用户进程进行 I/O 操作时, 它首先调用 " 打开 " 获得对指定文件或设备的使用权, 并返回称为文件描述符的整型数, 以描述用户在打 开的文件或设备上进行 I/O 操作的进程 然后这个用户进程多次调用 " 读 / 写 "

More information

Ps22Pdf

Ps22Pdf 26 2 2009 2 Application Research of Computers Vol. 26 No. 2 Feb. 2009 Linux IPv6 * OLSR ( 610054) IPv6 Ad hoc OLSR Linux Linux OLSR OLSR IPv6 OLSR ; OLSR ; Linux ; ; IPv6 TP393 A 1001-3695( 2009) 02-0655-

More information

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc 2 5 8 11 0 13 1. 13 2. 15 3. 18 1 23 1. 23 2. 26 3. 28 2 36 1. 36 2. 39 3. 42 4. 44 5. 49 6. 51 3 57 1. 57 2. 60 3. 64 4. 66 5. 70 6. 75 7. 83 8. 85 9. 88 10. 98 11. 103 12. 108 13. 112 4 115 1. 115 2.

More information

计算机网络实验说明

计算机网络实验说明 计算机网络实验说明 龚旭东 电三楼 420 lzgxd@mailustceducn 2011 年 11 月 1 日 龚旭东 (TA) 计算机网络实验说明 2011 年 11 月 1 日 1 / 20 Outline 1 实验系统介绍 实验环境实验流程 2 实验内容编程实验交互实验观察实验 3 一些控制台命令 4 实验报告说明 龚旭东 (TA) 计算机网络实验说明 2011 年 11 月 1 日 2

More information

ebook12-1

ebook12-1 API N e t B I O S Wi n s o c k A P I Wi n s o c k 1 N e t B I O S Wi n s o c k A P I N e t B I O S O S / 2 D O S 2 3 4 Wi n d o w s Wi n d o w s 1 NetBIOS Network Basic Input/Output System, NetBIOS A P

More information

_汪_文前新ok[3.1].doc

_汪_文前新ok[3.1].doc 普 通 高 校 本 科 计 算 机 专 业 特 色 教 材 精 选 四 川 大 学 计 算 机 学 院 国 家 示 范 性 软 件 学 院 精 品 课 程 基 金 青 年 基 金 资 助 项 目 C 语 言 程 序 设 计 (C99 版 ) 陈 良 银 游 洪 跃 李 旭 伟 主 编 李 志 蜀 唐 宁 九 李 涛 主 审 清 华 大 学 出 版 社 北 京 i 内 容 简 介 本 教 材 面 向

More information

新版 明解C++入門編

新版 明解C++入門編 511!... 43, 85!=... 42 "... 118 " "... 337 " "... 8, 290 #... 71 #... 413 #define... 128, 236, 413 #endif... 412 #ifndef... 412 #if... 412 #include... 6, 337 #undef... 413 %... 23, 27 %=... 97 &... 243,

More information

提纲 1 2 OS Examples for 3

提纲 1 2 OS Examples for 3 第 4 章 Threads2( 线程 2) 中国科学技术大学计算机学院 October 28, 2009 提纲 1 2 OS Examples for 3 Outline 1 2 OS Examples for 3 Windows XP Threads I An Windows XP application runs as a seperate process, and each process may

More information

<4D6963726F736F667420576F7264202D204C696E7578CFB5CDB3B5F7D3C3C1D0B1ED>

<4D6963726F736F667420576F7264202D204C696E7578CFB5CDB3B5F7D3C3C1D0B1ED> Linux 系 统 调 用 列 表 雷 镇 (leicool@21cn.com) http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html ( 王 伟 注 : 本 文 是 从 作 者 的 博 文 上 拷 贝 来 的, 进 行 了 重 排 版 ) 简 介 : 本 文 列 出 了 大 部 分 常 见 的 Linux

More information

untitled

untitled A, 3+A printf( ABCDEF ) 3+ printf( ABCDEF ) 2.1 C++ main main main) * ( ) ( ) [ ].* ->* ()[] [][] ** *& char (f)(int); ( ) (f) (f) f (int) f int char f char f(int) (f) char (*f)(int); (*f) (int) (

More information

MASQUERADE # iptables -t nat -A POSTROUTING -s / o eth0 -j # sysctl net.ipv4.ip_forward=1 # iptables -P FORWARD DROP #

MASQUERADE # iptables -t nat -A POSTROUTING -s / o eth0 -j # sysctl net.ipv4.ip_forward=1 # iptables -P FORWARD DROP # iptables 默认安全规则脚本 一 #nat 路由器 ( 一 ) 允许路由 # iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT ( 二 ) DNAT 与端口转发 1 启用 DNAT 转发 # iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 dprot 422 -j DNAT to-destination

More information

多进程管理副本.key

多进程管理副本.key 美妙的多进程管理 造 个类 gunicorn 的轮 blog: xiaorui.cc github: github.com/rfyiamcool 内容 supervisor vs gunicorn vs uwsgi linux 异步信号 孤 进程 vs 僵 进程 daemon 的实现 prefork 是怎么 回事 打造 个较完善的多进程管理轮 怎么写代码 Master Worker elegance

More information

/3/15 1, linux. linux,,. : 1.NAT ; 2. (load balance, virtual server);; 3. ; 4. ; 5. 6.VPN; 7. ; 8. ; 9.. (,

/3/15 1, linux. linux,,. : 1.NAT ; 2. (load balance, virtual server);; 3. ; 4. ; 5. 6.VPN; 7. ; 8. ; 9.. (, Yawl(yawl@docshownet) wwwdocshownet 2000/3/15 1, linux linux,, 1NAT ; 2 (load balance,virtual server);; 3 ; 4 ; 5 6VPN; 7 ; 8 ; 9 (,, )IP, (VPN,, ) IP, (call_in_firewall(),call_fw_firewall(),call_out_firewall(),

More information

10 系统级 I/O 2017 年 4 月 5 日 9: 输入 / 输出 (I/O) 是在主存和外部设备之间拷贝数据的过程 输入是从 I/O 设备拷贝数据到主存, 输出是从主存拷贝数据到 I/O 设备 了解 I/O 的好处 : a. 帮助理解其它的系统概念 ; b. 有时候除了使用

10 系统级 I/O 2017 年 4 月 5 日 9: 输入 / 输出 (I/O) 是在主存和外部设备之间拷贝数据的过程 输入是从 I/O 设备拷贝数据到主存, 输出是从主存拷贝数据到 I/O 设备 了解 I/O 的好处 : a. 帮助理解其它的系统概念 ; b. 有时候除了使用 10 系统级 I/O 2017 年 4 月 5 日 9:20 2. 输入 / 输出 (I/O) 是在主存和外部设备之间拷贝数据的过程 输入是从 I/O 设备拷贝数据到主存, 输出是从主存拷贝数据到 I/O 设备 了解 I/O 的好处 : a. 帮助理解其它的系统概念 ; b. 有时候除了使用 Unix I/O 别无选择 分区 深入理解计算机系统 笔记的第 1 页 10.1 Unix I/O 2017

More information

TCP/IP TCP/IP OSI IP TCP IP IP TCP/IP TCP/IP

TCP/IP TCP/IP OSI IP TCP IP IP TCP/IP TCP/IP TCP/IP : TCP/IP TCP/IP OSI IP TCP IP IP TCP/IP TCP/IP 1. ASCII EBCDIC Extended Binary-Coded Decimal Interchange Code 2. / (1) (2) Single System Image SSI) (3) I/O (4) 3.OSI OSI Open System Interconnection

More information

Microsoft Word - 实用案例.doc

Microsoft Word - 实用案例.doc 计 算 机 系 统 应 用 2009 年 第 12 期 嵌 入 式 Linux 下 温 湿 度 传 感 器 的 设 计 与 实 现 1 Design and Implementation of Temperature and Humidity Sensor Based on Embedded Linux 陈 博 刘 锦 高 ( 华 东 师 范 大 学 电 子 科 学 技 术 系 上 海 200241)

More information

内 容 1 2 3 4 培 训 目 标 基 础 知 识 常 用 监 控 命 令 在 实 战 中 综 合 运 用 2

内 容 1 2 3 4 培 训 目 标 基 础 知 识 常 用 监 控 命 令 在 实 战 中 综 合 运 用 2 Linux 常 用 监 控 命 令 介 绍 基 础 应 用 组 梁 若 羽 2011-07-12 1 内 容 1 2 3 4 培 训 目 标 基 础 知 识 常 用 监 控 命 令 在 实 战 中 综 合 运 用 2 培 训 目 标 掌 握 常 用 监 控 命 令 的 用 途 和 启 用 方 法 熟 悉 各 个 关 键 输 出 参 数 的 真 实 含 义 了 解 Linux 操 作 系 统 的 一

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

实施生成树

实施生成树 学习沉淀成长分享 Spanning-tree 红茶三杯 ( 朱 SIR) 微博 :http://t.sina.com/vinsoney Latest update: 2012-06-01 STP 的概念 冗余拓扑 Server/host X Router Y Segment 1 Switch A Switch B Segment 2 冗余拓扑能够解决单点故障问题 ; 冗余拓扑造成广播风暴, 多帧复用,

More information

IP505SM_manual_cn.doc

IP505SM_manual_cn.doc IP505SM 1 Introduction 1...4...4...4...5 LAN...5...5...6...6...7 LED...7...7 2...9...9...9 3...11...11...12...12...12...14...18 LAN...19 DHCP...20...21 4 PC...22...22 Windows...22 TCP/IP -...22 TCP/IP

More information

PowerPoint Presentation

PowerPoint Presentation 立 97 年度 SNMG 練 DNS & BIND enc1215@gmail.com DNS BIND Resolver Named 理 Named 更 DNS DNS Reference 2 DNS DNS 料 domain ip DNS server DNS server 理 DNS server DNS DNS 狀. root name server 理 3 DNS 狀 DNS (2). com

More information

<4D6963726F736F667420506F776572506F696E74202D20A1B6CFEEC4BFD2BB20B3F5CAB6BCC6CBE3BBFACDF8C2E7A1B7C8CECEF1C8FD20CAECCFA4544350A1A24950D0ADD2E9BACD4950B5D8D6B72E707074>

<4D6963726F736F667420506F776572506F696E74202D20A1B6CFEEC4BFD2BB20B3F5CAB6BCC6CBE3BBFACDF8C2E7A1B7C8CECEF1C8FD20CAECCFA4544350A1A24950D0ADD2E9BACD4950B5D8D6B72E707074> 项 目 一 : 初 识 计 算 机 网 络 任 务 三 熟 悉 TCP/IP 协 议 和 IP 地 址 一. 学 习 要 求 : 学 习 要 求 及 难 点 1. 了 解 IP 协 议 TCP 协 议 和 UDP 协 议 2. 熟 悉 IP 地 址 的 划 分 和 分 类 3. 了 解 IPV6 的 地 址 结 构 二. 难 点 : 1. IP 地 址 三. 学 时 : 1. 理 论 教 学 :6

More information

Socket Programming in the Banking Collection Service Counter System

Socket Programming in the Banking Collection Service Counter System Socket Programming in the Banking Collection Service Counter System Gang WANG Hubei Radio and TV University, Wuhan, China Email: wg970701@sina.com Abstract: This paper describes the use of TCP / IP programming

More information

编制组播程序

编制组播程序 编制组播程序 一 实验目的 理解组播通信的概念及原理, 比较组播通信方式和通常的单播通信方式有何不同 理解 组播通信的实现, 通过编制简单的利用组播方式通信的应用程序来加深对组播的理解 二 实验原理 1 组播地址组播不同于通常的单播, 要实现组播需要使用 D 类地址, 成为组播 IP 地址 在 IPv4 中, 从 224.0.0.1 到 239.255.255.255 间的所有 IP 地址都属于 D

More information

The Library SysLibSockets

The Library SysLibSockets The Library SysLibSockets.lib...2 SysSockAccept...3 SysSockBind...3 SysSockClose...4 SysSockConnect...4 SysSockCreate...5 SysSockGetHostByName...5 SysSockGetHostName...6 SysSockGetOption...6 SysSockGetLastError...7

More information

11.1 C/S 编程模型 2017 年 5 月 3 日 20: 每个网络应用都是基于 C/S 编程模型的 采用这个模型, 一个应用是由一个服务器进程和一个或多个客户端进程组成 服务器管理某种资源, 并且通过操作这种资源来为它的客户端提供某种服务 C/S 模型中的基本操作是事务 (

11.1 C/S 编程模型 2017 年 5 月 3 日 20: 每个网络应用都是基于 C/S 编程模型的 采用这个模型, 一个应用是由一个服务器进程和一个或多个客户端进程组成 服务器管理某种资源, 并且通过操作这种资源来为它的客户端提供某种服务 C/S 模型中的基本操作是事务 ( 11 网络编程 2017 年 4 月 5 日 9:20 所有的网络应用都是基于相同的编程模型, 有着相似的整体逻辑结构, 并且依赖相同 的编程接口 分区 深入理解计算机系统 笔记的第 1 页 11.1 C/S 编程模型 2017 年 5 月 3 日 20:21 1. 2. 每个网络应用都是基于 C/S 编程模型的 采用这个模型, 一个应用是由一个服务器进程和一个或多个客户端进程组成 服务器管理某种资源,

More information

Linux网 络 编 程

Linux网  络  编  程 Linux 网络编程 本章主要介绍一下网络编程的基本知识 由于书中后面章节都有一些简单的源程序实例来对各 章的基本概念进行解释, 因此必须具备必要的网络编程知识 在平时工作中, 为了查找安全漏洞, 也需要编写一些短小精悍的程序来代替复杂的手工命令输 入 在操作系统一章中对 Linux 中的 C 语言编程和调试已经作了介绍 本章在前两章的基础上, 首 先对 Linux 中的网络编程作介绍,Linux

More information

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf (%d, & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf (%d %d 2013 18 ( ) 1. C pa.c, pb.c, 2. C++ pa.cpp, pb.cpp, Compilation Error cin scanf Time Limit Exceeded 1: A 5 B 5 C 5 D 5 E 5 F 5 1 2013 C 1 # include 2 int main ( void ) 3 { 4 int cases, a, b,

More information

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1 21 , 7, Windows,,,, : 010-62782989 13501256678 13801310933,,,, ;,, ( CIP) /,,. : ;, 2005. 11 ( 21 ) ISBN 7-81082 - 634-4... - : -. TP316-44 CIP ( 2005) 123583 : : : : 100084 : 010-62776969 : 100044 : 010-51686414

More information

目 录(目录名)

目  录(目录名) 目录 目录...1-1 1.1 域名解析配置命令... 1-1 1.1.1 display dns domain... 1-1 1.1.2 display dns dynamic-host... 1-1 1.1.3 display dns server... 1-2 1.1.4 display ip host... 1-3 1.1.5 dns domain... 1-4 1.1.6 dns resolve...

More information

C/C++ 语言 - 循环

C/C++ 语言 - 循环 C/C++ Table of contents 7. 1. 2. while 3. 4. 5. for 6. 8. (do while) 9. 10. (nested loop) 11. 12. 13. 1 // summing.c: # include int main ( void ) { long num ; long sum = 0L; int status ; printf

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

2 本文尚未完成, 僅供中央機械網管使用!! 要公開也等我寫完吧 G Exploring Socket Programming Prefect 聽說, 鳥人超強. Who Should Read This Book? 本書適合想要實作 Winsock 程式的 Programmer 閱讀 這本書的原則

2 本文尚未完成, 僅供中央機械網管使用!! 要公開也等我寫完吧 G Exploring Socket Programming Prefect 聽說, 鳥人超強. Who Should Read This Book? 本書適合想要實作 Winsock 程式的 Programmer 閱讀 這本書的原則 2 本文尚未完成, 僅供中央機械網管使用!! 要公開也等我寫完吧 G Prefect 聽說, 鳥人超強. Who Should Read This Book? 本書適合想要實作 Winsock 程式的 Programmer 閱讀 這本書的原則是 : 1. 以實作為主, 廢話哈啦很少 2. 章節內容以講解每章主題範例程式為主, 因此 Code 會佔很重份量 3. 討論實際設計 Winsock 程式容易遇到的問題

More information

本文由筱驀釹贡献

本文由筱驀釹贡献 本 文 由 筱 驀 釹 贡 献 ppt 文 档 可 能 在 WAP 端 浏 览 体 验 不 佳 建 议 您 优 先 选 择 TXT, 或 下 载 源 文 件 到 本 机 查 看 Linux 操 作 系 统 Linux 操 作 系 统 第 一 部 分 介 绍 与 安 装 Linux 的 由 来 : Linux 的 由 来 : 的 由 来 Linus Torvalds 1.Linux 的 版 本 1.Linux

More information

ebook67-9

ebook67-9 9 IP 9.1 I P 9-1 I P 9-1 d a e m o n U n i x d a e m o n d a e m o n [Perlman 1992] 10 R I P Routing Information Protocol I P 9-1 I P 30 I C M P 9. 5 r o u t e n e t s t a t route netstat UDP TCP ICMP

More information

C/C++语言 - C/C++数据

C/C++语言 - C/C++数据 C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;

More information

<4D6963726F736F667420576F7264202D20BCC6CBE3BBFACDF8C2E7CAB5D1E9D6B8B5BCCAD6B2E12E646F63>

<4D6963726F736F667420576F7264202D20BCC6CBE3BBFACDF8C2E7CAB5D1E9D6B8B5BCCAD6B2E12E646F63> 计 算 机 网 络 实 验 指 导 手 册 华 中 科 技 大 学 计 算 机 学 院 二 零 零 九 年 三 月 I 目 录 实 验 一 网 络 组 建 与 实 施 第 一 章 实 验 目 标 和 内 容... 1 1.1 实 验 目 的... 1 1.2 实 验 环 境... 1 1.3 实 验 要 求... 1 1.4 实 验 内 容... 2 第 二 章 BOSON NETSIM 软 件 包

More information

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas 目录 1 IPv6 快速转发 1-1 1.1 IPv6 快速转发配置命令 1-1 1.1.1 display ipv6 fast-forwarding aging-time 1-1 1.1.2 display ipv6 fast-forwarding cache 1-1 1.1.3 ipv6 fast-forwarding aging-time 1-3 1.1.4 ipv6 fast-forwarding

More information

AL-M200 Series

AL-M200 Series NPD4754-00 TC ( ) Windows 7 1. [Start ( )] [Control Panel ()] [Network and Internet ( )] 2. [Network and Sharing Center ( )] 3. [Change adapter settings ( )] 4. 3 Windows XP 1. [Start ( )] [Control Panel

More information

第11章 可调内核参数

第11章 可调内核参数 11 11 Unix BSD 4.4 Linux sysctl Unix Linux /proc window /proc /proc/sys /proc/sys sysctl Unix root /proc/sys/vm root /proc/sys sysctl /proc/sys struct ctl_table 18274 struct ctl_tables /proc/sys struct

More information

untitled

untitled 3 C++ 3.1 3.2 3.3 3.4 new delete 3.5 this 3.6 3.7 3.1 3.1 class struct union struct union C class C++ C++ 3.1 3.1 #include struct STRING { typedef char *CHARPTR; // CHARPTR s; // int strlen(

More information

ebook15-4

ebook15-4 4 4.1 I / O I / s t a t s t a t ( ) U N I X 4.2 stat fstat lstat s t a t #include #include int stat(const char p a * t h n a m e, struct stat b * u f) ; int fstat(int f i l e

More information

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha CYPOK CYPOK 1 UltraEdit Project-->Install Language Tool: Language Suite----->hi-tech picc Tool Name ---->PICC Compiler Executable ---->c:hi-picinpicc.exe ( Command-line Project-->New Project-->File Name--->myc

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information