在线等:WSARecv投递失败,WSAGetLastError返回10045,重叠IO

robin_yao 2006-04-06 05:35:11
解决就给分!
顺便问下WSAGetLastError怎么查错误编号(10045)所对应的解释啊!
我在MSDN中查不到,菜的不好意思了!!
...全文
692 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
striking 2006-04-07
  • 打赏
  • 举报
回复
信息太少了.

1. Overlapped的event是否create
2. 是否提供有效的buffer (WSABUF 的指向buffer )


如果以上的回答都是ok, 贴出代码
robin_yao 2006-04-07
  • 打赏
  • 举报
回复
WSAEOPNOTSUPP (10045)
• Translation: Operation not supported.
• Description: The operation that was tried is not supported for the type of object that is referenced. This error typically occurs when a socket descriptor to a socket that cannot support this operation is trying to accept a connection on a datagram socket.

MS网站找的说明!
robin_yao 2006-04-07
  • 打赏
  • 举报
回复
up
robin_yao 2006-04-07
  • 打赏
  • 举报
回复
情况终于有了改观
我设flag=0后,返回错误为10014了
慢慢来,快了!!!
striking 2006-04-07
  • 打赏
  • 举报
回复
既然第一次没有错, 那你知道怎么改了吗?

你的程序只有一个 acceptoverlapped!!!
robin_yao 2006-04-07
  • 打赏
  • 举报
回复
1.第一次accept的时候没错
2.WSAOVERLAPPED acceptoverlapped[WSA_MAXIMUM_WAIT_EVENTS]; //每个client对应一个overlapp. 这个我知道。
3.设flags=0?在哪里设?
4.这个以后再考虑,先把这个问题搞定
striking 2006-04-07
  • 打赏
  • 举报
回复
参数 WSA_FLAG_OVERLAPPED 不要再改回去!!
striking 2006-04-07
  • 打赏
  • 举报
回复
不晓得第一次accept是否就错了.
1.
WSAOVERLAPPED acceptoverlapped;

->

WSAOVERLAPPED acceptoverlapped[WSA_MAXIMUM_WAIT_EVENTS]; //每个client对应一个overlapp.
////////////////////////////////////////
2.
databuf.len = DATA_BUFSIZE;
databuf.buf = buffer;

buffer 道理同overlap.

3.
设flags=0;


4. 最好将信息统一放在一个结构体内.如
typedef struct _SOCKET_INFORMATION {
CHAR Buffer[DATA_BUFSIZE];
WSABUF DataBuf;
SOCKET Socket;
WSAOVERLAPPED Overlapped;
DWORD BytesSEND;
DWORD BytesRECV;
} SOCKET_INFORMATION, * LPSOCKET_INFORMATION;
robin_yao 2006-04-07
  • 打赏
  • 举报
回复
striking(硬撑者) 改了还是没用!
sdf123321 2006-04-07
  • 打赏
  • 举报
回复
striking(硬撑者) 高手呀

解决一下我的问题吧,谢谢
http://community.csdn.net/Expert/topic/4663/4663080.xml?temp=.1440088
striking 2006-04-07
  • 打赏
  • 举报
回复
listensock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
->

listensock = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0,
WSA_FLAG_OVERLAPPED);

参数应该指定WSA_FLAG_OVERLAPPED 表示 为重叠
robin_yao 2006-04-07
  • 打赏
  • 举报
回复
每次跟踪到WSARecv 下面的WSAGetLastError的返回值就发现返回10045错误
郁闷啊
robin_yao 2006-04-07
  • 打赏
  • 举报
回复
#define DATA_BUFSIZE 4096
#include <WINSOCK2.H>
#include <ostream.h>
#pragma comment(lib,"ws2_32")
void main(void)
{
DWORD recvbytes;
DWORD flags;
WSABUF databuf;
char buffer[DATA_BUFSIZE];
WSAEVENT eventarray[WSA_MAXIMUM_WAIT_EVENTS];
WSAOVERLAPPED acceptoverlapped;
SOCKET listensock,acceptsock;
DWORD EventTotal=0;
WSAData wsadata;
SOCKADDR_IN SerAddr;
WSAStartup(MAKEWORD(2,2),&wsadata);

listensock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

SerAddr.sin_family = AF_INET;
SerAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
SerAddr.sin_port = htons(7780);

bind(listensock,(SOCKADDR *)&SerAddr,sizeof(SerAddr));
listen(listensock,5);




acceptsock = accept(listensock,NULL,NULL);
if (WSAGetLastError() == 0)
{
eventarray[EventTotal] = WSACreateEvent();
ZeroMemory(&acceptoverlapped,sizeof(WSAOVERLAPPED));
acceptoverlapped.hEvent = eventarray[EventTotal];
databuf.len = DATA_BUFSIZE;
databuf.buf = buffer;
EventTotal++;
int ii;
ii = WSARecv(acceptsock,&databuf,1,&recvbytes,&flags,&acceptoverlapped,NULL);
if ( ii == SOCKET_ERROR)
{
ii = WSAGetLastError();
if ( ii != WSA_IO_PENDING)
{
cout<<"WSARecv Error!"<<endl;
closesocket(acceptsock);
WSACloseEvent(eventarray[EventTotal]);
return;

}
}


}



while (1)
{
DWORD dwIndex;
DWORD BytesTransferred;
DWORD Flags;
dwIndex = WSAWaitForMultipleEvents(EventTotal,eventarray,FALSE,WSA_INFINITE,FALSE);


WSAResetEvent(eventarray[dwIndex - WSA_WAIT_EVENT_0]);

WSAGetOverlappedResult(acceptsock,&acceptoverlapped,&BytesTransferred, FALSE,&Flags);
if (BytesTransferred == 0)
{
closesocket(acceptsock);
WSACloseEvent(eventarray[dwIndex - WSA_WAIT_EVENT_0]);
return;
}


}

}
robin_yao 2006-04-06
  • 打赏
  • 举报
回复
我自己找到答案了
:参考的对象类型不支持尝试的操作。 请高手解释一下什么意思?
如何解决?

18,356

社区成员

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

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