一些网络编程笔记

常用的linux用于查问题命令

ifcoinfg
nc
netstart
lsof
tcpdump
telnet

常见的网络问题

1.bind函数地址问题

不绑定端口设置为0,然后用getsockname去获取端口,可以避免自己指定的端口被别人使用而自己不能用
bind客服端也可以使用,用来指定自己使用的端口号 不是服务器专用

2.异步的connect函数

connect不是客服端专用 是堵塞的,Connect中的21秒延时
tcp连接的异步connect实现流程如下:
(1)设置socket连接为NONBLOCK
(2)调用connect函数
(3)poll函数检测fd
(4)判断poll函数的返回值来确定连接是否建立
在这个代码,如果传入的超时时间小于等于0,那么poll会一直等待。
但是要注意的是,这里所谓的一直等待,绝对不是无限期等下去,具体等待时间与系统配置参数有关。
比如你连接的目的地址不存在,那么syn最多重试发送net.ipv4.tcp_syn_retries次后就会返回POLLERR。
小细节
要先设置非堵塞的,如果设置成这样的就可以不需要判断返回值了,因为他是立刻返回的,当然为了精准判断可以加判断
linux还需要在判断select的错误码才能知道连上没有 Windows不需要

3.send和recv函数返回值问题
recv:

阻塞与非阻塞recv返回值没有区别,都是:
<0 出错
=0 对方调用了close API来关闭连接
>0 接收到的数据大小, 特别地:返回值<0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的,继续接收。
阻塞模式下recv会一直阻塞直到接收到数据,非阻塞模式下如果没有数据就会返回,不会阻塞着读,因此需要循环读取

send:

当程序使用send方法的时候,send会首先检查协议sockfd中的发送缓冲区中是否有数据发送,send会比较发送数据的buf长度和sockfd发送数据的缓冲区长度,如果len大于sockfd的发送长度,则send返回SOCKET_ERROR,如果发送缓冲区的大小足够,则将数据buf中的数据发送至发送缓冲区中,确认send函数将数据拷贝至发送换区中,另外,如果send检测发送缓冲区有数据但是还未发送,就比较该缓冲区的剩余空间和和len的大小,如果len大于剩余空间,就一直等待,直到缓冲区中的数据发送玩为止,如果len<缓冲区剩余的大小,就将发送的数据拷贝至该缓冲区中,如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;如果send在等待协议传送数据时网络断开的话,那么send函数也返回SOCKET_ERROR。(send函数只是将数据拷贝至发送缓冲中,就返回,此刻数据不一定发送至接收端)。

4.shutdown与优雅关闭

单方面调用 close()/closesocket()
断开连接,之后主机A、B都不能再接受对方传输的数据。实际上,是完全无法调用与数据收发有关的函数。
一般情况下这不会有问题,但有些特殊时刻,需要只断开一条数据传输通道,而保留另一条。
使用 shutdown() 函数可以达到这个目的
close() / closesocket() 用来关闭套接字
shutdown() 用来关闭连接,而不是套接字,不管调用多少次 shutdown(),套接字依然存在
调用 close()/closesocket() 关闭套接字时,或调用 shutdown() 关闭输出流时,都会向对方发送 FIN 包。FIN 包表示数据传输完毕,计算机收到 FIN 包就知道不会再有数据传送过来了。
默认情况下,close()/closesocket() 会立即向网络中发送FIN包,不管输出缓冲区中是否还有数据,而shutdown() 会等输出缓冲区中的数据传输完毕再发送FIN包。也就意味着,调用 close()/closesocket() 将丢失输出缓冲区中的数据,而调用 shutdown() 不会。

常见的网络模型重难点

WSAEventSelect
WSASyncSelect
select
pool
epool
IOCP

设计一套网络库需要那些功能

使用那种io复用函数
收发数据的正确姿势
接收和发送缓冲区
socket connection session 组织关系

网络通讯协议怎么设计

http
smtp/pop3/imap
ftp
自定义格式
tlv格式
pb&thrift

网络编程怎么学

每个socket api要熟练掌握 api使用的细节要知道,比如返回值,什么时候什么状态 网络底层知识要掌握,比如 tcp
三次握手,四次挥手,udp http,滑动窗口,每个状态怎么出现的,等等底层实现 然后找个好的源码一层层了解内部,学生人士可以看看大部头的书籍那种标杆式的书籍
社会人士没必要在去啃了,事倍功半,建议看韩国人写的那本网络书籍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值