SOCKET connect 产生10048错误

yinzhaohui 2007-04-21 03:23:05
我使用SOCKET 连接服务器产生10048错误,不是每一次都出现这个错误有时会出现
代码如下
ATLASSERT(m_sock==INVALID_SOCKET);
int iRet=0;
//建立一个SOCKET
m_sock=socket(AF_INET,SOCK_STREAM,0);
if(m_sock == INVALID_SOCKET)
throw exception("建立SOCKET失败");

//指明客户端SOCKET(随便建立个端口)
sockaddr_in clientaddr;
clientaddr.sin_family=AF_INET;
clientaddr.sin_port=0;
clientaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
//如果在下面中产生异常要求,获取后释放资源
try
{
//邦定客户端SOCKET信息到建立的SOCKET上
iRet=::bind(m_sock,(PSOCKADDR)&clientaddr,sizeof(clientaddr));
if(iRet==SOCKET_ERROR)
throw exception("邦定IP失败!");
//建立和服务端的连接
sockaddr_in serveraddr;
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons((u_short)port);
//DNS解析
::hostent *hent=::gethostbyname(ip);
if(hent==NULL || hent->h_addr_list[0]==NULL)
throw exception("relove host failed");
u_long *p=(u_long *)hent->h_addr_list[0];
serveraddr.sin_addr.S_un.S_addr=*p;
iRet=::connect(m_sock,(PSOCKADDR)&serveraddr,sizeof(serveraddr));
if(iRet==INVALID_SOCKET)
{
char buf[256]={0};
sprintf(buf,"连接%s:%d失败.",ip,port);
throw exception(buf);
}
}
catch(exception &e)
{
close();
throw exception(e.what());
}
catch(...)
{
close();
throw exception("未知错误");
}

SOCKET 10048 是由SOCKET 被重用,
看了一些文章后删除上面代码中bind代码,由于bind会在连接时自动产生
还是有这个错误,请大家解决一下,万分感谢,会不足可以再加
...全文
5350 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yinzhaohui 2007-04-24
  • 打赏
  • 举报
回复
yebeans(追逐牛牛们的背影) 谢谢
大概问题以知道,最主要就是TIME_WAIT,主动关闭的一方会进行TIME_WAIT状态,这个状态要保持大概2分钟,可以修改注册表,使用SO_LINGER不会删除TIME_WAIT这个状态,它主要是为了删除CLOSE_WAIT状态,所以不论我什么使用SO_LINGER都不会有用,我测试过了,这也和网上的一些文章有点不一样
fairyprince 2007-04-23
  • 打赏
  • 举报
回复
跟踪一下看看,每次端口是否一样
yinzhaohui 2007-04-23
  • 打赏
  • 举报
回复
过后我删除了bind代码,代码还是这样的,没有影响
roger_it 2007-04-23
  • 打赏
  • 举报
回复
m_sock=socket(AF_INET,SOCK_STREAM,0);是指TCP,TCP不应该用bind吧?
应该是connect吧?
yebeans 2007-04-23
  • 打赏
  • 举报
回复
1024~5000的是系统分配的临时端口,当PORT为0的时候由系统分配,从1024开始每次++(如果超过5000应该就是俗称的高位端口了吧),只是一种可能,我没有试过分配那么多端口,不知道用完了会怎么样`
如果一个应用程序需要把端口捆绑到超过1024-5000范围的特定端口时,比如rsh需要捆绑到任一保留端口,则可如下编程:

SOCKADDR_IN sin;
SOCKET s;
u_short alport=IPPORT_RESERVED;
sin.sin_family=AF_INET;
sin.sin_addr.s_addr=0;
for (;;) {
sin.sin_port=htons(alport);
if (bind(s,(LPSOCKADDR)&sin, sizeof(sin))=0) {
/* it worked */
}
if (GetLastError()!=WSAEADDRINUSE) {
/* fail */
}
alport-;
if (alport=IPPORT_RESERVED/2) {
/* fail-all unassigned reserved ports are */
/* in use. */
}
}
yinzhaohui 2007-04-22
  • 打赏
  • 举报
回复
closesocket()的语义受SO_LINGER与SO_DONTLINGER选项影响,对比如下:

选项 间隔 关闭方式 等待关闭与否
SO_DONTLINGER 不关心 优雅 否
SO_LINGER 零 强制 否
SO_LINGER 非零 优雅 是

若设置了SO_LINGER(亦即linger结构中的l_onoff域设为非零),并设置了零超时间隔,则closesocket()不被阻塞立即执行,不论是否有排队数据未发送或未被确认。这种关闭方式称为“强制”或“失效”关闭,因为套接口的虚电路立即被复位,且丢失了未发送的数据。在远端的 recv()调用将以WSAECONNRESET出错。
若设置了SO_LINGER并确定了非零的超时间隔,则closesocket()调用阻塞进程,直到所剩数据发送完毕或超时。这种关闭称为“优雅的”关闭。请注意如果套接口置为非阻塞且SO_LINGER设为非零超时,则closesocket()调用将以WSAEWOULDBLOCK错误返回。
若在一个流类套接口上设置了SO_DONTLINGER(也就是说将linger结构的l_onoff域设为零;则closesocket()调用立即返回。但是,如果可能,排队的数据将在套接口关闭前发送。请注意,在这种情况下WINDOWS套接口实现将在一段不确定的时间内保留套接口以及其他资源,这对于想用所以套接口的应用程序来说有一定影响。

我连接时没有设置SO_LINGER,默认应当是零 强制 否这种情况
您的意思是说closesocket()没有能关闭完一个SOCKET吗,
我使用SO_LINGER设置为非0看看

yinzhaohui 2007-04-22
  • 打赏
  • 举报
回复
是不是对象析构/重建时间过短,而 SOCKET还没有被释放掉?
每次都会重新建立该对象,应当不会

或者可供分配的临时端口用完了(如果端口号置为0,则WINDOWS套接口实现将给应用程序分配一个值在1024到5000之间的唯一的端口。)

不是端口可以到65536吗,为什么只能到5000了
DentistryDoctor 2007-04-21
  • 打赏
  • 举报
回复
可以考虑用SO_LINGER
yebeans 2007-04-21
  • 打赏
  • 举报
回复
closesocket()的语义受SO_LINGER与SO_DONTLINGER选项影响,对比如下:

选项 间隔 关闭方式 等待关闭与否
SO_DONTLINGER 不关心 优雅 否
SO_LINGER 零 强制 否
SO_LINGER 非零 优雅 是

若设置了SO_LINGER(亦即linger结构中的l_onoff域设为非零),并设置了零超时间隔,则closesocket()不被阻塞立即执行,不论是否有排队数据未发送或未被确认。这种关闭方式称为“强制”或“失效”关闭,因为套接口的虚电路立即被复位,且丢失了未发送的数据。在远端的recv()调用将以WSAECONNRESET出错。
若设置了SO_LINGER并确定了非零的超时间隔,则closesocket()调用阻塞进程,直到所剩数据发送完毕或超时。这种关闭称为“优雅的”关闭。请注意如果套接口置为非阻塞且SO_LINGER设为非零超时,则closesocket()调用将以WSAEWOULDBLOCK错误返回。
若在一个流类套接口上设置了SO_DONTLINGER(也就是说将linger结构的l_onoff域设为零;则closesocket()调用立即返回。但是,如果可能,排队的数据将在套接口关闭前发送。请注意,在这种情况下WINDOWS套接口实现将在一段不确定的时间内保留套接口以及其他资源,这对于想用所以套接口的应用程序来说有一定影响。


------------------------------------------------------------------------------------
是不是对象析构/重建时间过短,而 SOCKET还没有被释放掉?
或者可供分配的临时端口用完了(如果端口号置为0,则WINDOWS套接口实现将给应用程序分配一个值在1024到5000之间的唯一的端口。)
yinzhaohui 2007-04-21
  • 打赏
  • 举报
回复
后来修改为
~blocksocket(void){close();}
void close()
{
if(m_sock != INVALID_SOCKET)
{
shutdown(SD_BOTH);
closesocket(m_sock);
m_sock = INVALID_SOCKET;
}
}
yinzhaohui 2007-04-21
  • 打赏
  • 举报
回复
应当不会,那个是我封装的一个对象,在拆构时会自动释放的
~blocksocket(void){close();}
void close()
{
if(m_sock != INVALID_SOCKET)
{
closesocket(m_sock);
m_sock = INVALID_SOCKET;
}
}
CathySun118 2007-04-21
  • 打赏
  • 举报
回复
是不是socket没有释放

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧