如果不用bind直接connect,系统分给客户端的端口是随机的,我想用固定的端口就用了下面的程序,可是只能连接几次,多了就connect不上了,得过一会才行好像,为什么呢?
int flag=0,lenn=sizeof(int);
client.sin_family=AF_INET;
client.sin_port=htons("5569");
client.sin_addr.S_un.S_addr=inet_addr("201.4.155.130"); //客户端ip
if(setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char*)&flag,lenn)<0)
MessageBox("setsockopt error");
if(bind(sock,(struct sockaddr *)&client,sizeof(client))<0)
MessageBox("bind client error");
if(connect(sock,(const sockaddr*)&server,sizeof(server)))
MessageBox("not connect ");
int flag=0,lenn=sizeof(int);
client.sin_family=AF_INET;
client.sin_port=htons("5569");
client.sin_addr.S_un.S_addr=inet_addr("201.4.155.130"); //客户端ip
if(setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char*)&flag,lenn)<0)
MessageBox("setsockopt error");
if(bind(sock,(struct sockaddr *)&client,sizeof(client))<0)
MessageBox("bind client error");
if(connect(sock,(const sockaddr*)&server,sizeof(server)))
MessageBox("not connect ");
它们之间会通过三次协商最后相互关闭;它们都会经历一个过程
由:TIME_WAIT-->closesocket();这个过程一般要经历4分钟(240s)
所以当你的客户bind()一个固定端口后,在断开到重新连接的过程
至少是240s
而且如果是TIME_WAIT,是不是bind应该提示出错呢?为什么没有这样的提示那?
flag=1或0都没有用,有什么区别吗?winsock里面是不是没有SO_REUSEPORT ?
是不需要Socket缓冲;
int main()
{
WSADATA wsaData;
WORD version=MAKEWORD(2,0);
int ret=WSAStartup(version,&wsaData);
if(ret!=0)
perror("Initilize Error!\n"); //初始化socket失败
struct sockaddr_in server_addr,client_addr;
int serSocket,flag,count;
count=0;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(7777);
server_addr.sin_addr.S_un.S_addr=inet_addr("213.14.10.120"); //服务器ip地址
while(count<30)
{
count++;
if((serSocket=socket(AF_INET,SOCK_STREAM,0)) == -1)
{
printf("创建Socket发生错误!");
closesocket(serSocket);
return -1;
}
flag=1;
setsockopt(serSocket,SOL_SOCKET,SO_REUSEADDR,(char *)&flag,sizeof(int)); client_addr.sin_family = AF_INET;
client_addr.sin_port = htons(6696);
client_addr.sin_addr.s_addr = INADDR_ANY;
if(bind(serSocket,(struct sockaddr *)&client_addr,sizeof(client_addr)) == -1)
{
printf("绑定错误");
closesocket(serSocket);
return -1;
} if(connect(serSocket,(struct sockaddr *)&server_addr,sizeof(server_addr))==-1)
{
printf("连接服务器发生错误,地址:");
closesocket(serSocket);
return -1;
}
else
printf("连接成功%d\n",count);
closesocket(serSocket);
}
}