求助, 关于"bind使用"和"send失败error_code:10057"

oldn123 2011-04-04 02:30:56
我有一个程序,在连接server前用了bind(代码不是我写的,我不知道为什么要用bind),连接成功后,
send数据失败,返回错误码是10057。

当把bind那句注掉后,可以send成功数据,但是服务器端不能正常处理我发的数据,会给我返回错误的信息。

附部分代码:
void CCommOpr::ConnectSvr(LPCSTR stripInfo, int nPort, CMySocket * pSocket)
{
ASSERT(pSocket);

SOCKADDR_IN sockAddr;

ASSERT(stripInfo);
ASSERT(nPort != 0);

memset((void*)&sockAddr,0,sizeof(sockAddr));
sockAddr.sin_family = AF_INET;
sockAddr.sin_port = htons(nPort);
sockAddr.sin_addr.s_addr = inet_addr(stripInfo);

sockaddr_in si;
si.sin_family = AF_INET;
si.sin_addr.s_addr = inet_addr("192.168.1.102");//我的本地ip
si.sin_port = htons(12320); //端口号似乎可以随便写?

if ( SOCKET_ERROR == bind(pSocket->m_clientSocket,
(SOCKADDR*)&si, 0x10))
{
SetLastError( WSAGetLastError() );
return ;
}


int iConnect = connect(pSocket->m_clientSocket,
(LPSOCKADDR)&sockAddr,sizeof(sockAddr));

if(iConnect > 0)
{
pSocket->m_bConnect = FALSE;
}
else
{
pSocket->m_bConnect = TRUE; //成功
}
}

我对bind的作用不大理解,希望能帮助解释一下.
还有为什么bind后 后面我再send 数据会失败.

谢谢.
...全文
721 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
shifagengen 2013-05-18
  • 打赏
  • 举报
回复
bind,应该是考虑到客户端可能是多网卡的原因,如果不bind的话,可能会存在一些问题。 至于10057,代表还没有连接上。可以用事件FD_CONNECT捕获一下,最终connect是成功了,还是失败了。 最近,我也遇到过类似的情况。大部分情况下,是OK的。我也遇到过,愣是等不到有connect结束的情况。 敢问兄台,您那个到后来解决了吗?
oldn123 2011-04-05
  • 打赏
  • 举报
回复
高手帮忙看看问题啊
oldn123 2011-04-04
  • 打赏
  • 举报
回复
好吧,谢谢,等待高手..
HowToP2p 2011-04-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 oldn_cc_bird 的回复:]
我的这个是异步连接啊,返回-1应该是正常的吧, 是否成功我要在message中看的
[/Quote]

不好意忘了还有异步的情况...bind也成功,connect也成功,我不明白了,等待高手~
oldn123 2011-04-04
  • 打赏
  • 举报
回复
我的这个是异步连接啊,返回-1应该是正常的吧, 是否成功我要在message中看的
HowToP2p 2011-04-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 oldn_cc_bird 的回复:]
也是成功的,返回值是-1,因为注册过窗口消息,在消息里可以收到FD_CONNECT的消息
[/Quote]
返回-1说明有错

Return Values
If no error occurs, this function returns zero. If an error occurs, it returns SOCKET_ERROR, and a specific error code can be retrieved by calling WSAGetLastError.
oldn123 2011-04-04
  • 打赏
  • 举报
回复
也是成功的,返回值是-1,因为注册过窗口消息,在消息里可以收到FD_CONNECT的消息
HowToP2p 2011-04-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 oldn_cc_bird 的回复:]
bind的返回值是成功的.

现在就是纳闷为什么bind了send就失败,错误码10057.

如果不bind能send成功,但服务器反馈的数据不对。
[/Quote]

那bind之后的connect是否成功呢?
oldn123 2011-04-04
  • 打赏
  • 举报
回复
bind的返回值是成功的.

现在就是纳闷为什么bind了send就失败,错误码10057.

如果不bind能send成功,但服务器反馈的数据不对。
HowToP2p 2011-04-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oldn_cc_bird 的回复:]
引用 3 楼 howtop2p 的回复:

如果要bind就是要作服务器,让别的客户端来connect他


好,那现在先不管有没有程序来连他。

这只是一个客户端程序,调用了bind, 但里面没发现调用Listen和accept的代码.

只是作为客户端去连接服务器, 在不bind 的情况下send 数据是成功的, bind后就send不成功了, 问题发生在哪里?
[/Quote]

纯粹的客户端并不用bind,但bind也应该不影响,如果出错,先看看bind返回值是否正常
oldn123 2011-04-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 howtop2p 的回复:]

如果要bind就是要作服务器,让别的客户端来connect他
[/Quote]

好,那现在先不管有没有程序来连他。

这只是一个客户端程序,调用了bind, 但里面没发现调用Listen和accept的代码.

只是作为客户端去连接服务器, 在不bind 的情况下send 数据是成功的, bind后就send不成功了, 问题发生在哪里?
HowToP2p 2011-04-04
  • 打赏
  • 举报
回复
如果要bind就是要作服务器,让别的客户端来connect他
oldn123 2011-04-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 howtop2p 的回复:]

bind用于TCP服务器的绑定...
connect用于客户端连接服务器...

基于TCP/IP的,服务器bind之后要调用Listen,然后调用accept,客户端通过connect发起连接,双方然后通过connect以及accept返回的socket进行通信,这个时候才能send,recv
[/Quote]

谢谢你的回复,
服务器bind之后要调用Listen?我现在的这个程序只是客户端的程序,用的bind。怎么理解呢?

这个是初始化socket的代码
BOOL CCommOpr::InitSocket(CMySocket * pSocket, UINT uMessage)
{
ASSERT(pSocket);

pSocket->m_clientSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_IP);

ASSERT(m_wndForComm.GetSafeHwnd());

UINT nFlag = FD_CLOSE | FD_CONNECT | FD_READ | FD_WRITE;
int iErrorCode=WSAAsyncSelect(pSocket->m_clientSocket, m_wndForComm.GetSafeHwnd(),
uMessage, nFlag);

if(iErrorCode==SOCKET_ERROR)
{
ASSERT(FALSE);
}
else
{
}

BOOL bSet = TRUE;
setsockopt(pSocket->m_clientSocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&bSet, sizeof(BOOL));
int nVal = 0x8000;
setsockopt(pSocket->m_clientSocket, SOL_SOCKET, SO_SNDBUF, (const char*)&nVal, sizeof(int));
int nVal1 = 0x10000;
setsockopt(pSocket->m_clientSocket, SOL_SOCKET, SO_RCVBUF, (const char*)&nVal1, sizeof(int));

return TRUE;
}
HowToP2p 2011-04-04
  • 打赏
  • 举报
回复
bind用于TCP服务器的绑定...
connect用于客户端连接服务器...

基于TCP/IP的,服务器bind之后要调用Listen,然后调用accept,客户端通过connect发起连接,双方然后通过connect以及accept返回的socket进行通信,这个时候才能send,recv

18,356

社区成员

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

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