socket error 10053,10054究竟是怎么引起的

wjb_yd 2011-01-24 05:26:24
谁能贴点代码,能稳定的重现这2个socket error吗?
我就是想知道,出现这2个问题时,TCP协议栈到底遇到什么异常情况了。
100分送上!
...全文
27070 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
outblack 2013-04-15
  • 打赏
  • 举报
回复
引用 9 楼 ssx1414 的回复:
服务器SOCKET关闭了 客户端send就会报错
我同意这位仁兄的看法。我之前也遇到过,服务器send之后就关闭了socket,结果send成功了,但是客户端receive时就报10053的错误。
绿 2013-01-07
  • 打赏
  • 举报
回复
我也遇到一样的问题了。
  • 打赏
  • 举报
回复
远程主机强制关闭了一个现有的连接
jwybobo2007 2011-01-27
  • 打赏
  • 举报
回复

// 下面这2句代码如果注释掉,后面的recv就能正解的返回0。如果不注释掉,recv就会返回-1,
// 并得到10053这个错误
rs = send(SocketServer, temp, sizeof(temp) + 1, 0);
err = WSAGetLastError();

出现10053的原因是因为在你执行这次send的时候对端已经执行过closesocket了,而发送的数据还是被成功的推入了发送缓冲区中,因此返回了0,此时你可能还没得到FIN消息,而紧接着recv这边就得到了对端关闭socket的FIN消息,因此此时需要放弃发送缓冲中的数据,异常终止连接,所以得到了
10053错误:您的主机中的软件中止了一个已建立的连接。

而为什么又能得到10054的错误号,原因应该在于你设置了SO_LINGER了,一但设置了它,则有一个等待时间,在该等待时间内可以处理发送缓冲区的数据,一但超时或者发送缓冲都被发送完并被确认,则服务端有可能发送RST消息而不是FIN,此时就应该得到重置错误,也就是10054。

不同的系统对SO_LINGER的实现方式不一样,得到的结果也不一样,不知道按我这样解释是否对你有帮助。如果我有理解错误,欢迎大家指正。
wjb_yd 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 visualeleven 的回复:]
10053: An established connection was aborted by the software in your host machine.
10054: An existing connection was forcibly closed by the remote host.
[/Quote]
老兄,MSDN我也会查,可否正面回答一下我的问题。

10053里说的software在我的例子中指的就是那个send函数吗,是send函数执行的时候,发现对方的套接字已经关闭了,所以它把己方的套接字也关掉了吗,然后导致后续的recv报错10053?
Eleven 2011-01-26
  • 打赏
  • 举报
回复
10053: An established connection was aborted by the software in your host machine.
10054: An existing connection was forcibly closed by the remote host.
wjb_yd 2011-01-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ssx1414 的回复:]
服务器SOCKET关闭了 客户端send就会报错
[/Quote]

问题是客户端send成功了,之后的recv失败了。
而如果客户端不send那一下的话,之后的recv就能正常的返回0。

所以我就想知道这一次send到底做了什么事情? 导致后续的recv不能返回0了?
ssx1414 2011-01-26
  • 打赏
  • 举报
回复
服务器SOCKET关闭了 客户端send就会报错
wjb_yd 2011-01-26
  • 打赏
  • 举报
回复
这个是服务器的

WORD VersionRequested;
WSADATA WsaData;

VersionRequested = MAKEWORD(2, 2);

if (WSAStartup(VersionRequested, &WsaData))
{
printf("加载socket库失败!\n");
return -1;
}

// 监听来自浏览器的请求
SOCKET SockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SOCKADDR_IN AddrClient;
AddrClient.sin_family = AF_INET;
AddrClient.sin_addr.s_addr = INADDR_ANY;
AddrClient.sin_port = htons(9999);

if (SockServer == INVALID_SOCKET)
{
printf("socket初始化失败!\n");
closesocket(SockServer);
WSACleanup();
return -1;
}

if (bind(SockServer, (sockaddr*)&AddrClient, sizeof(AddrClient)) != 0)
{
printf("socket绑定失败!\n");
closesocket(SockServer);
WSACleanup();
return -1;
}

if (listen(SockServer, 10) != 0)
{
printf("socket监听失败!\n");
closesocket(SockServer);
WSACleanup();
return -1;
}

while (1)
{
SOCKET NewSocket = accept(SockServer, NULL, NULL);
if (INVALID_SOCKET == NewSocket)
{
closesocket(NewSocket);
continue;
}
else
{
struct linger so_linger;
so_linger.l_onoff = 1;
so_linger.l_linger = 30;
setsockopt(NewSocket ,SOL_SOCKET, SO_LINGER, (const char*)&so_linger, sizeof(so_linger));
}

char buff[1024];
int rs = recv(NewSocket, buff, sizeof(buff), 0);

char temp[] = "hello, client";
rs = send(NewSocket, temp, sizeof(temp) + 1, 0);

closesocket(NewSocket);
}
wjb_yd 2011-01-26
  • 打赏
  • 举报
回复
贴2段能稳定重现10053的代码

先贴客户端的:

WORD VersionRequested;
WSADATA WsaData;

VersionRequested = MAKEWORD(2, 2);

if (WSAStartup(VersionRequested, &WsaData))
return -1;

SOCKET SocketServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SOCKADDR_IN AddrServer;
AddrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
AddrServer.sin_port = htons(9999);
AddrServer.sin_family = AF_INET;

// 连接服务器
if (0 != connect(SocketServer, (SOCKADDR *)&AddrServer, sizeof(SOCKADDR)))
{
closesocket(SocketServer);
return false;
}

int err = 0;
char temp[] = "hello, server";
int rs = send(SocketServer, temp, sizeof(temp) + 1, 0);

char buff[1024] = {0};
rs = recv(SocketServer, buff, sizeof(buff), 0);

// 下面这2句代码如果注释掉,后面的recv就能正解的返回0。如果不注释掉,recv就会返回-1,
// 并得到10053这个错误
rs = send(SocketServer, temp, sizeof(temp) + 1, 0);
err = WSAGetLastError();

rs = recv(SocketServer, buff, sizeof(buff), 0);
err = WSAGetLastError();

system("pause");
return 0;

yhbreeze 2011-01-25
  • 打赏
  • 举报
回复
可能,对方程序绑定的TCP端口,被别的程序强行关闭,如木马!
wjb_yd 2011-01-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 superdiablo 的回复:]
比如对方程序崩溃时,你应该就会收到10054错误。
[/Quote]

据我观察,不崩溃,也会出现10054,求详细解释~
wjb_yd 2011-01-25
  • 打赏
  • 举报
回复
没人能贴段代码说明一下这个问题吗???
举个例子也行呀~
superdiablo 2011-01-24
  • 打赏
  • 举报
回复
比如对方程序崩溃时,你应该就会收到10054错误。
RLib 2011-01-24
  • 打赏
  • 举报
回复
oyljerry 2011-01-24
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20080401/22/6be8dcf6-aef6-4333-a585-c7bcda0a23d9.html

18,358

社区成员

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

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