环境配置
使用ifconfig命令设置网卡的IP地址和掩码
ifconfig eth0 192.168.xxx.xxx netmask 255.255.255.0
设置默认路由。
route add default gw 192.168.xxx.xxx
程序编译
GCC
编译命令
gcc hello.c -o hello
gcc -o hello hello.c
执行生成的可执行文件
./hello
gcc相关指令
http://www.cnblogs.com/zhangsir6/articles/2956798.html
经过gcc编译的程序在只适用特定的硬件平台的linux系统,一般使用make进行编译。
#include "stdio.h"
int main(int argc, char** argv) {
printf("argc = %d\n",argc);
printf("argv[0] = %s\n",argv[0]);
printf("argv[1] = %s\n",argv[1]);
}
使用下面的命令编译源代码:
gcc -o myprogram main.c
在终端执行命令:./myprogram 192.168.0.1
程序结果
argc 代表命令行参数的个数,argv[0] 代表程序本身的名称,argv[1] 代表第一个命令行参数。
./myprogram 及 ./myprogram 123 456。
当执行命令 ./myprogram 192.168.0.1 时,argc 的值为 2,argv[0] 的值为 "./myprogram",argv[1] 的值为 "192.168.0.1"。
当执行命令 ./myprogram 时,argc 的值为 1,argv[0] 的值为 "./myprogram",argv[1] 不存在。
当执行命令 ./myprogram 123 456 时,argc 的值为 3,argv[0] 的值为 "./myprogram",argv[1] 的值为 "123",argv[2] 的值为 "456"。
char** argv是可变的。
有跟线程相关的函数
gcc -o pt pthread.c -lpthread
这个命令用于编译名为pthread.c的C语言源文件,并生成一个可执行文件pt。其中,-o选项指定输出文件名,-lpthread选项表示链接pthread库。
Makefile
输入make自动寻找makefile
1.需要由 make 工具创建的目标体(target),通常是目标文件或可执行文件。
2.要创建的目标体所依赖的文件(dependency_file)。
3.创建每个目标体时需要运行的命令(command)。
#注释
target:dependency_files
[TAB]command
clean:
rm -f 可执行文件 所有.o文件
注意:每一个命令行必须以[Tab]字符开始,[Tab]字符告诉 make 此行是一个命令行。
目标"clean"没有依赖,只有命令。删除 make 过程产生的中间文件。
$@是特殊的自动变量,代表当前规则的目标文件。
多文件时:先规则后编译
可执行文件x:各个文件的.o
gcc -o x 各个文件.o
文件.o:文件.c 依赖文件.h
gcc -c -o 文件.o 文件.c
#生成main.o的规则,[目标:依赖]
main.o:main.c 依赖文件.h
#编译命令 gcc 生成main.o -I参数是用来指定头文件目录
gcc -c -o main.o main.c -I 依赖 -I 依赖
#删除可执行文件和.o文件
clean:
rm -f 可执行文件x 文件.o main.o
调试
GDB是UNIX和Linux平台下字符界面的调试工具
gcc -o tt gdbsum.c –g(-g也可以放-o后面)
这个命令用于编译名为gdbsum.c的C语言源文件,并生成一个带有调试信息的可执行文件tt。其中,-o选项指定输出文件名,-g选项表示生成调试信息。
调试过程
进入gdb的办法
1. 在编译成功后输入gdb + 编译后的文件名
2. 在命令行中先输入gdb进入gdb调试模式,再输入file + 加载要调试的程序。
注:用info registers 来查看程序的寄存器状态
指令
p str 命令显示变量str的当前值。
使用gdb命令启动tt程序,在gdb环境下,b main命令添加断点在main函数处,r 命令开始运行,n 命令是单步执行代码,c 命令是运行到下一个断点处。
多线程
在Linux平台中线程操作相关函数有:
1.线程创建函数pthread_create
2.等待另一线程结束函数pthread_join
3.线程分离函数pthread_detach
4.线程自我结束函数pthread_exit
头文件:#include<pthread.h>
通过fork函数创建子进程:pid=fork();
网络编程
OSI的7层结构
- 物理层(Physical Layer)
- 数据链路层(Data Link Layer)
- 网络层(NetWork Layer)
- 传输层(Transport Layer)
- 会话层(Session Layer)
- 表示层(Presentation Layer)
- 应用层(Application Layer)
TCP/IP参考模型
从上至下
应用层、传输层、网络层和网络接口层
ARP是向网络查询目录主机的IP地址,根据IP地址获得MAC地址转化协议。
Ping命令是基于ICMP协议的一种应用。
DNS协议实现域名到IP的转换。用于域名解析。
telnet协议在传输用户名和密码时是明文传输。
网络协议分层与对应工作的硬件设备。
物理层:网卡、网线、中继器、集线器
链路层:网桥、交换机
网络层:路由器
TCP三次握手
1. 客户端发SYN,请求连接
2.服务器发SYN或ACK
3.客户端收到后发ACK
IP首部的结构体定义:
字段长度是8位时, 其类型是unsigned char
字段长度是16位时,其类型是unsigned short
字段长度是32位时,其类型是unsigned int
UDP
直接调用sendto方法即可实现信息发送,接收端使用receivefrom方法接收数据
调用Socket函数
socket,bind,sendto,receivefrom,close
Socket函数
socket 创建一个TCP、UDP或RawSocket
bind 绑定本机IP和端口
listen TCP监听
accept TCP为客户端提供socket资源
connect 客户端发起三次握手
send TCP向目标发字节流
recv 接收字节序列,返回值为字节数,shutdown后返回值为0断开连接(没有清除资源)
socket(PF_INET,SOCK_STREAM,0);
connect(sock,(struct sockaddr *)&serv_addr,sizeof(serv_addr))==-1(失败)
read(sock,message,sizeof(message)-1);
shutdown(sock,SHUT_RDWR);
bind(serv_listen_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1(失败)
listen(serv_listen_sock,5)==-1(失败)
accept(serv_listen_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_size);
TCP/UDP异同
不同:TCP是可靠的、面向字节流的传输层协议,需要建立连接后发送数据,有三次握手,通过发送序列号、确认应答机制保证数据的发送顺序和完整性,使用滑动窗口控制发送速率,适应接收方处理能力,利用拥塞窗口控制发送速率防止网络过载。常用于文件传输。支持一对多连接。
1. 采用select的IO模式
2.poll模式
3.epoll模式
4.多线程模式
5.多进程模式
UDP是不可靠的、面向数据报的传输层协议,会丢包,常用于简单消息传输。
相同:都是传输层协议。
Java网络通信
TCP
Socket(SocketChannel)
ServerSocket(ServerSocketChannel)
UDP
DatagramSocket (DatagramChannel)
DatagramPacket
InetSocketAddress 主机+端口
InetAddress IP地址或主机名
BIO(Blocking) 阻塞
NIO(Non-Blocking) 非阻塞
AIO 异步非阻塞网络
DatagramSocket, Socket,ServerSocket所使用的方法都是属于BIO
函数调用
1. free(s)
释放指针s
2.close方法实现关闭文件资源
3.gethostbyname函数可实现使用域名转换为IP的功能
其他
1. 除了用malloc函数返回的指针地址外,所有的局部变量都不可以在函数外使用。也不可以将局部变量地址return出去。
2.arpa网是因特网前身
3.TCP是网络中最常用的面向连接的传输层协议,HTTP、FTP等协议就是基于TCP协议的应用层协议。
4.SNMP网络管理的协议是基于UDP的应用层协议。
5.Ping命令是基于ICMP协议的一种应用
6.IP头部校验和用于确保IP头部的完整性
校验和计算
(1)展开为十六进制,每四位为一个数,不足四个补零。
(2)第六个四位数为校验和数,替换为0000
(3)四位四位地相加
(4)高16位与低16位相加
(5)取反
(6)看和校验字段一不一样
7.使用 "-c" 选项允许用户指定发送的请求次数。例如,在命令 "ping -c www.baidu.com" 中,"-c" 后面应跟上具体的次数,如 "ping -c 4 www.baidu.com" 将发送4个请求。如果不指定次数,许多系统默认会持续发送请求直到手动停止
当使用-c
参数编译C或C++源代码时,GCC会检查语法和语义错误,生成相应的汇编代码,并将其转化为目标代码。这个过程包括头文件的包含处理、宏替换、代码优化等步骤。编译完成后,会生成.o
文件,这些文件包含了编译后的二进制代码和必要的调试信息,但还不包含最终执行文件所需的所有链接元素。
8.不同编程语言生成的通信程序在通信须采用相同的字符编码方案,较佳的字符编码方案是UTF-8。