- 应尽量避免将网络编程与业务逻辑穿插在一起。
- 注意TCP连接断开的时机与条件。
因此,在应用层设计时,应考虑到TCP断开时的设计。
(注:close太早可能会导致协议栈发生RST分解,连接重置,导致数据接收不完整。 在阻塞IO中可以使用SO_LINGER选项,但在非阻塞IO中此选项无用)
参考:《Windows网络编程 5.6.4顺序释放连接》
在服务器应用程序读取剩余数据之前,服务器主机的崩溃导致数据丢失,但客户并不知道。
对于面向连接的流式套接字而言,在调用closesocket()时,选项SO_LINGER和SO_DONTLINGER的配置决定了closesocket()的操作过程。这两个选项使得我们可以改变closesocket()的默认配置,要求在用户进程与内核间传递linger结构,声明当调用closesocket()时,如果仍有排队的数据等待发送套接字应当如何处理。) - TCP是字节流格式,只保证字节按顺序到达,但不保留消息的边界。
在应用层中,需要设计实现TCP分包的逻辑(将字节流切分成消息) - 不要直接发送语言中的结构体类型,原因有二:
1)为了考虑对齐,而修改了全局的对齐方式(attribute((packed))),破坏了abi导致第三方库coredump
2)高度不可扩展,如果增加一个字段,则客户端与服务端都需要进行升级。 - TCP自连接问题。
客户端向本机服务端发起连接时,某些条件下可能会出现自连接现象。localhost:54321<->localhost:54321 参考:self-connection
相关文章
- 12-19UNIX网络编程——产生RST
- 12-19165 python网络编程 - 单进程服务器(gevent版)
- 12-19【unix网络编程第三版】阅读笔记(四):TCP客户/服务器实例
- 12-19基于MFC的网络编程(远程桌面监控)学习笔记(二)发消息
- 12-19UNIX网络编程 第5章 TCP客户/服务器程序示例
- 12-19unix网络编程str_cli使用epoll实现
- 12-19UNIX网络编程卷1 server编程范式0 迭代server
- 12-19UNIX网络编程卷1 server程序设计范式8 预先创建线程,由主线程调用accept
- 12-19UNIX网络编程卷1 server程序设计范式1 并发server,为每一个客户请求fork一个进程
- 12-19socket网络编程快速上手(二)——细节问题(2)