hard noproc 65535 soft nofile 65535 hard nofile 65535 **生产环境内核参数调整:/etc/sysct.conf 解释 LINUX...简单抗D LINUX性能评估 vmstat 2 10 sar -u 2 10 CPU性能 free -m 性能指标 iostat -d 1 10 磁盘IO性能 sar -d 1 10
Linux下的tcp编程中,第一步就是要创建socket,本文将从源码角度看下socket是如何被创建的。...本文使用的linux内核版本为 ➜ bionic git:(ffdd392b8196) git remote get-url origin git://git.launchpad.net/~ubuntu-kernel.../ubuntu/+source/linux/+git/bionic ➜ bionic git:(ffdd392b8196) git status HEAD detached at Ubuntu-4.15.0...// include/linux/fs.h struct file_operations { ......有关epoll的源码分析,请参见 Linux epoll 源码分析 1 Linux epoll 源码分析 2 Linux epoll 源码分析 3 5.
// net/socket.c SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen) { struct...// net/socket.c static struct socket *sockfd_lookup_light(int fd, int *err, int *fput_needed) { struct...// net/ipv4/af_inet.c int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) { struct...// net/ipv4/inet_connection_sock.c int inet_csk_get_port(struct sock *sk, unsigned short snum) { .....// net/ipv4/inet_hashtables.c void inet_bind_hash(struct sock *sk, struct inet_bind_bucket *tb,
// fs/open.c SYSCALL_DEFINE1(close, unsigned int, fd) { int retval = __close_fd(current->files, fd)...// fs/file.c int __close_fd(struct files_struct *files, unsigned fd) { struct file *file; struct ...// fs/open.c int filp_close(struct file *filp, fl_owner_t id) { int retval = 0; ......// fs/file_table.c void fput(struct file *file) { if (atomic_long_dec_and_test(&file->f_count)) {...// fs/file_table.c static void __fput(struct file *file) { ... eventpoll_release(file); ...
// net/socket.c SYSCALL_DEFINE2(listen, int, fd, int, backlog) { struct socket *sock; ......// net/ipv4/af_inet.c int inet_listen(struct socket *sock, int backlog) { struct sock *sk = sock->sk...// net/ipv4/inet_connection_sock.c int inet_csk_listen_start(struct sock *sk, int backlog) { struct...// net/ipv4/inet_hashtables.c int inet_hash(struct sock *sk) { int err = 0; if (sk->sk_state !...} return err; } EXPORT_SYMBOL_GPL(inet_hash); 该方法又调用了__inet_hash,继续看下 // net/ipv4/inet_hashtables.c
// fs/read_write.c SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf, size_t, count...// fs/read_write.c ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t...// include/linux/fs.h static inline ssize_t call_write_iter(struct file *file, struct kiocb *kio,...// net/socket.c int sock_sendmsg(struct socket *sock, struct msghdr *msg) { ... return err ?...// net/ipv4/tcp.c int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size) { ...
// net/socket.c SYSCALL_DEFINE2(shutdown, int, fd, int, how) { int err, fput_needed; struct socket...// net/ipv4/af_inet.c int inet_shutdown(struct socket *sock, int how) { struct sock *sk = sock->sk;...// net/ipv4/tcp.c void tcp_shutdown(struct sock *sk, int how) { ... if (!
// fs/read_write.c SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count) { struct...// fs/read_write.c ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) {...// fs/read_write.c ssize_t __vfs_read(struct file *file, char __user *buf, size_t count, loff_t...之后又调用call_read_iter方法,传入这些新的参数,继续执行read逻辑 // include/linux/fs.h static inline ssize_t call_read_iter...// net/socket.c int sock_recvmsg(struct socket *sock, struct msghdr *msg, int flags) { ...
accept方法对应的内核源码为 // net/socket.c SYSCALL_DEFINE3(accept, int, fd, struct sockaddr __user *, upeer_sockaddr...{ return sys_accept4(fd, upeer_sockaddr, upeer_addrlen, 0); } 该方法调用了名为accept4的系统调用 // net/socket.c...// net/ipv4/af_inet.c int inet_accept(struct socket *sock, struct socket *newsock, int flags, bool...// net/ipv4/inet_connection_sock.c struct sock *inet_csk_accept(struct sock *sk, int flags, int *err,...看下inet_csk_wait_for_connect方法 // net/ipv4/inet_connection_sock.c static int inet_csk_wait_for_connect
connect方法对应的内核源码为 // net/socket.c SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr...// net/ipv4/af_inet.c int inet_stream_connect(struct socket *sock, struct sockaddr *uaddr, int...// net/ipv4/af_inet.c int __inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,...// net/ipv4/tcp_ipv4.c int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) {...// net/ipv4/tcp_output.c int tcp_connect(struct sock *sk) { struct tcp_sock *tp = tcp_sk(sk); struct
// net/ipv4/tcp_ipv4.c int tcp_v4_rcv(struct sk_buff *skb) { ......// net/ipv4/tcp_input.c void tcp_fin(struct sock *sk) { ......// net/ipv4/tcp_ipv4.c int tcp_v4_rcv(struct sk_buff *skb) { ......// net/ipv4/tcp_ipv4.c int tcp_v4_rcv(struct sk_buff *skb) { ......// net/ipv4/tcp_ipv4.c int tcp_v4_rcv(struct sk_buff *skb) { ...
例程 TCP/IP例程请参考github的tcp-ip目录下server.c和client.c。...github链接:https://github.com/RiceChen/Linux-process-communication.git,记得加个star。
// net/ipv4/tcp_ipv4.c int tcp_v4_rcv(struct sk_buff *skb) { ......// net/ipv4/tcp_ipv4.c int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb) { ......// net/ipv4/tcp_ipv4.c int tcp_v4_rcv(struct sk_buff *skb) { ......还是看tcp_v4_rcv方法 // net/ipv4/tcp_ipv4.c int tcp_v4_rcv(struct sk_buff *skb) { ......由于涉及到的代码太多,这里就不贴代码了,只说下相关方法 // net/ipv4/tcp_ipv4.c tcp_v4_syn_recv_sock // net/ipv4/inet_connection_sock.c
参考: 《Linux C 编程一站式学习》 《TCP/IP详解 卷一》
点分十进制 : 32 位二进制数, 每个十进制整数对应一个字节; -- 网络区分 : 第一个十进制整数即可区分 IP 地址类型, 0 ~ 127 A类, 128 ~ 191 B类, 192 ~ 223 C类...000000 00000000(网络号) 00000000 00000000(主机号) ~ 10(标识位) 111111(网络号) 11111111 11111111 11111111(主机号); C类地址
联系linux里面的ifconfig -a命令,这个命令通常会得到如下的结果 eth0 Link encap:Ethernet HWaddr 00:01:4A:03:5B:ED inet addr:192.168.11.2
二、基于Linux的多线程Web服务器端 这里Web服务端是用的多线程并发方式,而没有使用IOCP或epoll模型,因为客服端和服务端交换1次数据后就立即断开连接,没有足够时间发挥IPCP或epoll...// // main.cpp // hello_server // // Created by app05 on 15-10-27. // Copyright (c) 2015年 app05....protocol[] = "HTTP/1.0 200 OK\r\n"; //状态行(用HTTP1.1版本进行响应,你的请求已经正确处理) char server[] = "Server: Linux...fp) { char protocol[] = "HTTP/1.0 400 Bad Request\r\n"; //请求文件不存在 char server[] = "Server: Linux
相应地,并发型服务器采用以下步骤: C1. 等待一个客户请求的到来。 C2. 启动一个新的服务器来处理这个客户的请求。在这期间可能生成一个新的进程、任务或线程,并依赖底层操作系统的支持。...C3. 返回C 1步。 并发服务器的优点在于它是利用生成其他服务器的方法来处理客户的请求。也就是说,每个客户都有它自己对应的服务器。如果操作系统允许多任务,那么就可以同时为多个客户服务。...RFC 793 [Postel 1981c] 指出MSL为2分钟。然而,实现中的常用值是30秒,1分钟,或2分钟。 在实际应用中,对 IP数据报TTL的限制是基于跳数,而不是定时器。...对每个连接,T C P管理4个不同的定时器。 1) 重传定时器使用于当希望收到另一端的确认。 2) 坚持(persist)定时器使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口。
最近读完了《图解TCP/IP》,做一下总结加深记忆,后续会写几篇关于TCP/IP的文章。
f.FullName)) ; logWrite(e.FullPath, fileSize.ToString()); var c...remotePort.ToString(), fileName, filePath, fileSize.ToString(), storagePath }); //new Thread(c.Send...).Start(); Thread fileSendThread = new Thread(c.Send); fileSendThread.Start...192.168.0.194 8008 8007 C:...\Picture\device1 C:\Picture\device2 C:
领取专属 10元无门槛券
手把手带您无忧上云