当前位置: 首页 > wzjs >正文

网站建设的实验结论网站建设中服务器的搭建方式有几种

网站建设的实验结论,网站建设中服务器的搭建方式有几种,余姚做网站首荐荣盛网络,全国建设市场公共服务网站最近遇到一个网络问题,一个客户端线程在connect的时候,发几次syn之后不发了,每次connect都返回EINVAL。 用strace追踪了,connect的第一次参数socketfd并未变动,而且地址和端口号也是正确的,第三个参数len更…

最近遇到一个网络问题,一个客户端线程在connect的时候,发几次syn之后不发了,每次connect都返回EINVAL。

用strace追踪了,connect的第一次参数socketfd并未变动,而且地址和端口号也是正确的,第三个参数len更是用sizeof获得的肯定不会有问题。

还好问题比较好复现。

逐步加打印是在__inet_stream_connect函数中返回的EINVAL
https://elixir.bootlin.com/linux/v5.15.178/source/net/ipv4/af_inet.c#L649

	switch (sock->state) {default:err = -EINVAL; /* 后面connect系统调用一直返回-22,而不触发syn报文发送 */goto out;case SS_CONNECTED:err = -EISCONN;goto out;case SS_CONNECTING:if (inet_sk(sk)->defer_connect)err = is_sendmsg ? -EINPROGRESS : -EISCONN;elseerr = -EALREADY;/* Fall out of switch with err, set for this state */break;case SS_UNCONNECTED:err = -EISCONN;if (sk->sk_state != TCP_CLOSE)goto out;if (BPF_CGROUP_PRE_CONNECT_ENABLED(sk)) {err = sk->sk_prot->pre_connect(sk, uaddr, addr_len);if (err)goto out;}
... ...err = sk->sk_prot->connect(sk, uaddr, addr_len);if (err < 0)goto out;sock->state = SS_CONNECTING;/* Connection was closed by RST, timeout, ICMP error* or another process disconnected us.*/if (sk->sk_state == TCP_CLOSE)goto sock_error;/* sk->sk_err may be not zero now, if RECVERR was ordered by user* and error was received after socket entered established state.* Hence, it is handled normally after connect() return successfully.*/sock->state = SS_CONNECTED;err = 0;
out:return err;sock_error:err = sock_error(sk) ? : -ECONNABORTED;sock->state = SS_UNCONNECTED;if (sk->sk_prot->disconnect(sk, flags))sock->state = SS_DISCONNECTING; /* 注意这里是关键,最后一次syn之后超时,disconnect返回失败就把sock状态设置成disconnecting */goto out;
}

继续加打印为什么sk->sk_prot->disconnect会返回失败?返回值是EBUSY
就是这里:
https://elixir.bootlin.com/linux/v5.15.178/source/net/ipv4/tcp.c#L2989

int tcp_disconnect(struct sock *sk, int flags)
{
... .../* Deny disconnect if other threads are blocked in sk_wait_event()* or inet_wait_for_connect().*/if (sk->sk_wait_pending)return -EBUSY; /* 这里返回出错 */

那就是sk_wait_pending值不为0,那看sk_wait_pending修改的位置
https://elixir.bootlin.com/linux/v5.15.178/source/include/net/sock.h#L1128

#define sk_wait_event(__sk, __timeo, __condition, __wait)		\({	int __rc;						\__sk->sk_wait_pending++;				\release_sock(__sk);					\__rc = __condition;					\if (!__rc) {						\*(__timeo) = wait_woken(__wait,			\TASK_INTERRUPTIBLE,	\*(__timeo));		\}							\sched_annotate_sleep();					\lock_sock(__sk);					\__sk->sk_wait_pending--;				\__rc = __condition;					\__rc;							\})

而sk_wait_event是在
https://elixir.bootlin.com/linux/v5.15.178/source/net/core/stream.c#L75

/*** sk_stream_wait_connect - Wait for a socket to get into the connected state* @sk: sock to wait on* @timeo_p: for how long to wait** Must be called with the socket locked.*/
int sk_stream_wait_connect(struct sock *sk, long *timeo_p)
{DEFINE_WAIT_FUNC(wait, woken_wake_function);struct task_struct *tsk = current;int done;do {int err = sock_error(sk);if (err)return err;if ((1 << sk->sk_state) & ~(TCPF_SYN_SENT | TCPF_SYN_RECV))return -EPIPE;if (!*timeo_p)return -EAGAIN;if (signal_pending(tsk))return sock_intr_errno(*timeo_p);add_wait_queue(sk_sleep(sk), &wait);sk->sk_write_pending++;done = sk_wait_event(sk, timeo_p,!READ_ONCE(sk->sk_err) &&!((1 << READ_ONCE(sk->sk_state)) &~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)), &wait);remove_wait_queue(sk_sleep(sk), &wait);sk->sk_write_pending--;} while (!done);return 0;
}
EXPORT_SYMBOL(sk_stream_wait_connect);

sk_stream_wait_connect这个是在tcp send的时候调用的。
加打印可以看到connect线程和send线程在同时操作这个socketfd,根本原因是connect线程连接发送几个syn包后连接失败返回超时,内核会执行disconnect,而此时正好send线程走到wait for connect中,导致disconnect失败返回EBUSY,进而把sock状态设置成了disconnecting,后面每次connect系统调用就会直接返回EINVAL,不会触发syn报文的发送。

解决办法就是在send参数的flags中传递MSG_DONTWAIT,使得send线程不会去走wait for connect,如果未connect直接返回错误。这时connect线程每次调用都会触发syn报文。

http://www.dtcms.com/wzjs/592610.html

相关文章:

  • 网站建设深圳哪家好呼和浩特网站优化公司
  • python 网站开发框架炫酷特效网站
  • 网站地图制作怎么做宁夏考试教育网站
  • 织梦 调用网站地址网站百度排名查询
  • 广东企业移动网站建设哪家好北京网站设计公司新鸿儒
  • 织梦网站搬家工具建设网站大概要花多少钱
  • 国内全屏网站有哪些重庆市建设工程信息网官网网址
  • 自己做外贸网站能接到单吗c网站开发源代码
  • 做网站都需要服务器吗网站关键词优化网站推广
  • 阿里巴巴国际网站首页视频怎么做具有口碑的柳州网站建设公司
  • 西安加盟代理网站建设上海做网站优化哪家好
  • 网站层次索引模板计算机应用网站建设与维护是做什么
  • 帮忙做公司网站哪个网站可以哪些企业做哪些产品
  • access网站开发wordpress进不来后台
  • 购买网站空间ftp设计海纳企业网站管理系统源码
  • 个人网站如何搭建男科
  • 做字体的网站asp文件怎么做网站
  • 网络公关公司排名广州网站优化公司咨询
  • html5手机网站网页设计与制作设计网页源文件
  • 网站不备案备案公司网站备案需要多久
  • 网站建设的教学设计做海淘的网站
  • 鄂尔多斯网架公司郑州seo关键词优化公司
  • 期货融网站建设做足球经理头像的网站
  • 不同风格的网页江西短视频搜索seo推荐
  • 南通技嘉做网站wordpress直接上传视频
  • 网站精神文明建设专栏云设计工具
  • 怎么做pdf电子书下载网站wordpress4.5
  • 建设部网站预应力资质山西建设工程造价管理协会网站
  • seo神马网站推广器网络规划与设计实用教程
  • 家居企业网站建设公司电商网站开发公司杭州