Linux命令
查看所有状态的TCP连接
注意:在Ubuntu下要加sudo
才可以看到所有的TCP连接。
netstat -antp
ss -antp
查看正在监听的TCP连接
netstat -lntp
ss -lntp
解压缩
tar zxvf
启动/停止/重启vsftpd服务
service vsftpd start
service vsftdp stop
service vsftpd restart
在命令行上访问网页
curl localhost
which和whereis
which
:在PATH变量指定的路径中搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which
命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
whereis
:只能用于程序名的搜索,而且只能搜索二进制文件、man说明文件和源代码文件。
查看进程
ps -ef
ps aux
抓包
# -nn表示不解析抓包中的域名(即不反向解析)、协议以及端口号
tcpdump -i any 'tcp port 8888' -XX -nn -vv
tcpdump -i any 'src host 127.0.0.1 and tcp src port 12345' -XX -nn -vv
注意:在指定端口的时候,要指定是tcp的,还是udp的。
nc
nc -l 127.0.0.1 8888 # 在8888端口监听
nc 127.0.0.1 8888 # 使用操作系统分配的随机端口连接到127.0.0.1:8888
nc -p 12345 127.0.0.1 8888 # 指定用端口12345连接到127.0.0.1:8888
利用nc
传文件,注意这里要记住的是接收文件的是服务器端,发送文件的是客户端:
nc -l ip地址 端口号 > 接收的文件名 #服务器端命令
nc ip地址 端口号 < 发送的文件名 # 客户端命令
使用lsof命令查看TCP连接
lsof -i -Pn
pstack
pstack pid
telent
telnet 127.0.0.1 8888
host
host localhost
route
route add 10.10.98.18 gw 127.0.0.254
利用grep查找结构体、宏等定义
grep -r "struct timeval {" /usr/include -n
利用vim打开文件时定位到指定行号
vim test.txt +n 12
wc命令统计行数
ss -antp | wc -l
从标准输入读取并重定向
cat > test.txt
注意:按Ctrl+D结束输入。
svn
svn co 路径
svn co 路径 -r 版本号
svn up
svn up -r 版本号
svn log > log.txt
svn cleanup
git
git checkout 路径 # 检出
git pull # 更新到最新版
Python
命令行
import sys
sys.argv[1]
sys.argv[2]
Python网络编程API
from socket import *
from select import *
server = socket(AF_INET, SOCK_STREAM) # 注意:没有第三个参数
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server.bind(('', 12345)) # bind方法只接受一个参数
server.listen(5)
client, address = server.accpet() # 此处会阻塞,此时可以用nc连接上来
client.recv(1024) # 此处会阻塞
epoll = epoll()
epoll.register(client.fileno(), EPOLLIN) # register方法第二个参数不写的话,默认为EPOLLIN
epoll.poll(60) # 此处会阻塞,返回时会打印[(4, 1)],表示第4号文件可读(EPOLLIN == 1)
client.recv(1024) # 因为执行到这里,表示已经有数据可读了,不会阻塞
client.setblocking(0) # 设置成非阻塞
client.recv(1024) # 没有数据可读,立即返回,返回错误码EAGAIN == 11
epoll.modify(client.fileno(), EPOLLOUT) # 修改感兴趣事件
epoll.unresigter(client.fileno()) # 取消监听
client.close() # 关闭文件描述符
网络编程
TCP三次握手与四次挥手
TCP三次握手与四次挥手.pngTCP选项
IPPROTO_TCP
TCP_NODELAY
-
TCP_KEEPIDLE
、TCP_KEEPINTVL
、TCP_KEEPCNT
SOL_SOCKET
SO_REUSEADDR
SO_REUSEPORT
SO_KEEPALIVE
SO_SNDBUF
SO_RCVBUF
SO_SNDTIMEO
SO_RCVTIMEO
-
SO_LINGER
(struct linger
)
TCP报文头部
TCP报文头部.pngLinux API
Linux时间函数
Linux的计时函数,用于获取当前时间:
-
time(2)/time_t
(秒) -
ftime(3)/struct timeb
(毫秒) -
gettimeofday(2)/struct timeval
(微秒) -
clock_gettime(2)/struct timerspec
(纳秒)
getaddrinfo
// 监听套接字的创建
int s = -1, rv;
struct addrinfo hints, *servinfo, *p;
bzero(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
if (0 != (rv = getaddrinfo(NULL, "12345", &hints, &servinfo))) // 第一个参数为域名或者字符串形式的IP地址,第二个参数为服务名或者字符串形式的端口号
{
fprintf(stderr, "getaddrinfo: %s", gai_strerror(rv));
return -1;
}
for (p = servinfo; p != NULL; p = p->ai_next) // 域名可能对应多个IP地址
{
if (-1 == (s == socket(p->ai_family, p->ai_socktype, p->ai_protocol)))
{
continue;
}
if (0 != (rv = listen(s, 5)))
{
perror("listen");
return -1;
}
goto end;
}
end:
freeaddrinfo(servinfo);
设置O_NONBLOCK和CLOEXEC
// non_block
int flags = fcntl(sockfd, F_GETFL, 0);
flags |= O_NONBLOCK;
fcntl(sockfd, F_SETFL, flags);
// cloexec
int flags = fcntl(sockfd, F_GETFD, 0);
flags |= FD_CLOEXEC;
fcntl(sockfd, F_SETFD, flags);
Linux结构体
addrinfo
struct addrinfo {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
socklen_t ai_addrlen;
struct sockaddr *ai_addr;
char *ai_canonname;
struct addrinfo *ai_next;
};
pollfd
struct pollfd
{
int fd; /* file descriptor */
short events; /* requested events */
short revent; /* returned events */
};
epoll_event
typedef union epoll_data
{
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
struct epoll_event
{
uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
linger
struct linger
{
int l_onoff; // 0:off,非0:on
int l_linger; // linger time
};
timespec
struct timespec {
time_t tv_sec; // 秒
time_t tv_nsec; // 纳秒
};
itimerspec
struct itimerspec {
struct timespec it_interval; // 间隔
struct timespec it_value; // 首次到期时间
};
tm
struct tm {
int tm_sec; /* Seconds (0-60) */
int tm_min; /* Minutes (0-59) */
int tm_hour; /* Hours (0-23) */
int tm_mday; /* Day of the month (1-31) */
int tm_mon; /* Month (0-11) */ // +1
int tm_year; /* Year - 1900 */ // +1900
int tm_wday; /* Day of the week (0-6, Sunday = 0) */
int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */
int tm_isdst; /* Daylight saving time */
};
timeval
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
杂项
秒、毫秒、微秒和纳秒
- 秒(second):s
- 毫秒(millisecond):ms
- 微秒(microsecond):us
- 纳秒(nanosecond):ns
Mac配置
使用homebrew安装/更新软件
brew install git # 安装
brew uninstall git # 卸载
brew upgrade git # 更新
Mac配置多个Java版本
https://segmentfault.com/a/1190000013131276
Apache
sudo apachectl start # 启动Apache
sudo apachectl stop # 停止Apache
sudo apachectl restart # 重启Apache
Apache服务器默认的web根目录在:/Library/WebServer/Documents
,在该文件目录下的文件,所有用户都可以进行访问。
安装MySQL
https://www.jianshu.com/p/07a9826898c0
网友评论