【网络编程实践】1.2 网络编程注意事项

【网络编程实践】1.2 网络编程注意事项_第1张图片

  1. 应尽量避免将网络编程与业务逻辑穿插在一起。
  2. 注意TCP连接断开的时机与条件。
    因此,在应用层设计时,应考虑到TCP断开时的设计。
    (注:close太早可能会导致协议栈发生RST分解,连接重置,导致数据接收不完整。 在阻塞IO中可以使用SO_LINGER选项,但在非阻塞IO中此选项无用
    参考:《Windows网络编程 5.6.4顺序释放连接》
    【网络编程实践】1.2 网络编程注意事项_第2张图片
    在服务器应用程序读取剩余数据之前,服务器主机的崩溃导致数据丢失,但客户并不知道。
    对于面向连接的流式套接字而言,在调用closesocket()时,选项SO_LINGER和SO_DONTLINGER的配置决定了closesocket()的操作过程。这两个选项使得我们可以改变closesocket()的默认配置,要求在用户进程与内核间传递linger结构,声明当调用closesocket()时,如果仍有排队的数据等待发送套接字应当如何处理。)
  3. TCP是字节流格式,只保证字节按顺序到达,但不保留消息的边界。
    在应用层中,需要设计实现TCP分包的逻辑(将字节流切分成消息)
  4. 不要直接发送语言中的结构体类型,原因有二:
    1)为了考虑对齐,而修改了全局的对齐方式(attribute((packed))),破坏了abi导致第三方库coredump
    2)高度不可扩展,如果增加一个字段,则客户端与服务端都需要进行升级。
  5. TCP自连接问题。
    客户端向本机服务端发起连接时,某些条件下可能会出现自连接现象。localhost:54321<->localhost:54321 参考:self-connection

你可能感兴趣的:(#,网络编程实践,linux,tcp/ip,Linux,C编程,网络,网络协议)