Linux网络编程【5】(TCP和UDP网络编程注意事项)

287 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

TCP和UDP网络编程注意事项

1 TCP网络编程

图片.png

  1. 客户端一般不需要绑定自己的信息,是因为客户端的ip地址和端口号操作系统会自动分配,便于用户操作,如果想自己设置也是可以的,只要调用bind即可;

  2. 服务器端的accept的后两个参数如果设置为NULL,则客户端的网络信息结构体无法获取,但是可以正常通信,因为只要有一个客户端与服务器连接,服务器的accept函数都会返回与之对应的文件描述符,所以服务器与客户端通信都是使用这个文件描述符来操作的;

  3. TCP网络编程中通信既可以使用recv、send,也可以使用recvfrom、sendto,还可以使用read、write;

  4. TCP网络编程中connect就是一个发送函数,accept就是一个接收函数,connect发送的是客户端自己的网络信息结构体,accept是服务器用于接收客户端信息的函数;

  5. TCP服务器默认是一个循环服务器,服务器同一时间只能与一个客户端通信或者连接,是因为TCP服务器端有两个阻塞函数,accept和recv,这两个函数无法同时运行,可以使用多进程、多线程或者IO多路复用的方式解决。

2 UDP网络编程

图片.png

  1. UDP虽然是无连接的,但是在发送数据的时候指定了对方的信息,所以可以发送,也就意味着sendto函数可以理解为是connect和send的二合一,而recvfrom函数可以理解为是accept和recv的二合一;

  2. UDP客户端也不需要绑定自己的信息,操作系统可以随机分配,如果想指定也可以,调用bind即可;

  3. UDP服务器的recvfrom后两个参数无法设置为NULL,因为如果设置为NULL,意味着服务器不想获取客户端的信息,那么服务器就无法使用sendto函数给客户单发送数据;

  4. UDP客户端的recvfrom一般是可以设置为NULL的,因为服务器的信息客户端手动设置过,所以sendto发送没问题,只要对方知道客户端的信息,就可以给客户端发送数据;

  5. UDP服务器默认就是一个并发服务器,是因为服务器端只有一个读阻塞函数recvfrom;

  6. UDP网络编程中可以使用recvfrom和sendto函数,UDP客户端还可以使用connect、recv和send,但是服务器无法改变。