Linux上,一个套接字如何加入不同的组播?能否提供一个小程序?

Linux上,一个套接字如何加入不同的组播?能否提供一个小程序?,第1张

1.TCP流式套接字的编程步谈碰骤

在使用之前须链接库函数:工程->设置->Link->输入ws2_32.lib,辩侍此OK!

SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0)//创建套接字(socket)。

SOCKADDR_IN addrSrv

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY)//转换Unsigned short为网络字节序的格式

addrSrv.sin_family=AF_INET

addrSrv.sin_port=htons(6000)

客户携迅端代码如下:

#include <Winsock2.h>

#include <stdio.h>

void main()

{

WORD wVersionRequested

WSADATA wsaData

int err

wVersionRequested = MAKEWORD( 1, 1 )

err = WSAStartup( wVersionRequested, &wsaData )加载套接字库

if ( err != 0 ) {

return

}

if ( LOBYTE( wsaData.wVersion ) != 1 ||

HIBYTE( wsaData.wVersion ) != 1 ) {

WSACleanup()( )

return

}

SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0)创建套接字(socket)。

SOCKADDR_IN addrSrv

addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1")

addrSrv.sin_family=AF_INET

addrSrv.sin_port=htons(6000)

connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))向服务器发出连接请求(connect)。

char recvBuf[100]和服务器端进行通信(send/recv)。

recv(sockClient,recvBuf,100,0)

printf("%s\n",recvBuf)

send(sockClient,"This is lisi",strlen("This is lisi")+1,0)

closesocket(sockClient)关闭套接字。

WSACleanup()()//必须调用这个函数清除参数

}

刚刚开始使用flask框架写了两个小程序。然后我先访问了第一个“Hello,Web”的小程序,运行通过,然后想看看第二个inputname的程序是不是写对,但是linux报错:

socket.error: [Errno 98] Address already in use

大概意思就是地址被占用。因为socket默认是不支持地址复用的。为什么程序跑完了端口还是被占用着?这个问题就要TCP连接的“四次挥手”。

我们可能都有听过TCP/IP中“三次握手,四次挥手”,前者我们可能会更加了解一点,后者就不知道是什么样子。我也是T_T,所以我决定弄懂它。

在TCP/IP终止连接的四次握手中,当最后的ACK回复发出后,有个 2MSL 的时间等待,MSL指一个片段在网络中最大的存活时间,这个时间一般是30秒,所以基本上过60秒后就虚消可以重新连接!

为什么要等待2MSL?是因为在最后发出ACK回复后,发送方不能确认ACK是否被另一端正常收到,如果另一端没有收到ACK回复的话,蚂誉漏将会在1MSL后再次发送FIN片段。所以说发送方等待2MSL时间,也就是刚好它发ACK回复和对方发送FIN片段的时间,如果此时间内都没有再次收到FIN片段的话,发送方就假设对方已经正常接收到了ACK回复,此时它就会正常关闭连接!

以上就解释了为什么会出现跑另一个程序时会出现地址占用的情况。

接下去就是解决方案:

如果并发连接请求过多的时候,即短时间内连接请求很多,系统自动释放已占用端口的时间还没有到,又有连接请求(可用的端口已经被用完),所以还会出现闷烂 Address already in use错误提示),就会产生大量的TIME_WAIT状态的连接。这种情况下就有必要调整下linux的TCP/IP内核参数,让系统更快的释放TIME_WAIT连接。对于并发连接量大的情况我们需要这样设置:

呵呵,1.可能你根含铅念本就没有激活网卡。主要在你ethtool eth0中查看时还是NO

所以重新激派激活再查查。

2.可能是你的网卡趋谈困动没有装好吧。

3.你用service network restart 来重启。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12233577.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存