本文主要记录TCP/UDP网络编程的基础知识,采用TCP/UDP实现宿主机和目标机之间的网络通信。
为了区分不同应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP交互提供了称为嵌套字(Socket)的接口。
因此,如果要访问其它协议发送的数据必须使用原始嵌套字,它允许对底层协议(如IP或ICMP)直接访问。
一类是由互联网指派名字和号码公司ICANN负责分配给一些常用的应用程序固定使用的“周知的端口”,其值一般为0~1023。例如http的端口号是80,FTP为21,SSH为22,Telnet为23等。
在网络中,每一个节点(计算机或路由)都有一个网络地址,如192.168.1.4,也就是IP地址。
但是,网络地址只能确定进程所在的计算机,而一台计算机上很可能同时运行着多个进程,所以仅凭网络地址还不能确定到底是和网络中的哪一个进程进行通信,因此套接口中还需要包括其他的信息,也就是端口号(PORT)。
在一台计算机中,一个端口号一次只能分配给一个进程,也就是说,在一台计算机中,端口号和进程之间是一一对应关系。
例如,如网络中某一台计算机的IP为192.168.1.4,操作系统分配给计算机中某一应用程序进程的端口号为1500,则此时192.168.1.4 1500就构成了一个套接口。
但在实际编程中,并不针对sockaddr数据结构进行操作,而是用与其等价的sockaddr_in数据结构:
IP地址通常用数字加点(如192.168.1.4)表示,而在struct in_addr中使用的式32位整数表示。因此,Linux提供如下函数进行两者之间的转换:
常用的X86结构是小端模式,很多的ARM,DSP都为小端模式,即内存的低地址存储数据的低字节,高地址存储数据的高字节。
TCP有专门的传递保证机制,收到数据时会自动发送确认消息,发送方收到确认消息后才会继续发送消息,否则继续等待。
addr:一个struct sockaddr *指针,指定要绑定给sockfd的协议地址。内容结构由前面的协议族决定。
使服务器的这个端口和IP处于监听状态,等待网络中某一客户机的连接请求,最大连接数量为backlog≤128;
接受连接请求,建立起与客户机之间的通信连接。服务器处于监听状态时,如果某时刻获得客户机的连接请求,此时并不是立即处理这个请求,而是将这个请求放在等待队列中,当系统空闲时再处理客户机的连接请求;
当accept函数接受一个连接时,会返回一个新的socket标识符,以后的数据传输和读取就要通过这个新的socket编号来处理,原来参数中的socket也可以继续使用,继续监听其它客户机的连接请求;
若成功,返回一个由内核自动生成的一个全新描述字,代表与返回客户的TCP连接,否则返回-1,错误信息存在errno中;
其中注意的是,这里设置的socket内容是指 希望连接的服务器IP和端口号信息,IP地址来自用户的输入,并转换格式得到。因此,这里的设置和服务器的设置,要保持内容上的一致。
用来请求连接远程服务器,将参数sockfd的socket连至参数serv_addr所指定的服务器IP和端口号上去;
serv_addr:一个struct sockaddr类型的结构体指针变量,存储着远程服务器的IP与端口号信息
这样的好处是传输的数据是持续的,此外它是无连接的传输,比如实时视频时,如果采用TCP,中途有一点点数据出错都会卡住,进行等待,产生延时。加入使用UDP,尽管有少量的丢帧,但数据是实时的。
UDP传输的客户端少了connect(),原本该在connect()函数里传入服务器地址相关信息,现在变成了在sendto()里传入。
和前面TCP测试方式一样,先在Ubuntu主机上交叉编译服务器端代码,再在Ubuntu主机上编译客户端代码。
在开发板上运行服务器端代码,在Ubuntu主机先启动tmux分屏,再分别运行客户端代码。返回搜狐,查看更多

