在使用之前须链接库函数:工程->设置->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 来重启。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)