解决就给分!
顺便问下WSAGetLastError怎么查错误编号(10045)所对应的解释啊!
我在MSDN中查不到,菜的不好意思了!!
顺便问下WSAGetLastError怎么查错误编号(10045)所对应的解释啊!
我在MSDN中查不到,菜的不好意思了!!
解决方案 »
- 用AlplaBlend在picture control上绘图的AC_SRC_OVER参数会将新绘的图在原图的基础上进行叠加
- 把单文档分割成了两部分,如何获取视口部分的指针
- 请教一个基础问题:WORD *a; 那么 a[0],a[1]...又分别代表什么意思呢?
- 一个很菜的问题,求助!
- 如何隐藏单文档框架的主菜单?
- 请问谁有开发,软件Licence的经验 ,像一些商用软件,必须有许可证才能用
- 这样获得设备路径有错误吗?再线等待!
- 诚聘VC高手!
- 谁知道80386sx之后的硬件模二除法运算汇编指令?帮助
- 谁知道如何编写Vxd文件?
- 编写网络程序时遇到的语法级问题,大家帮我解释一下.
- 如何监听一个被绑定的端口?
• 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网站找的说明!
2. 是否提供有效的buffer (WSABUF 的指向buffer )
如果以上的回答都是ok, 贴出代码
#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;
}
}}
郁闷啊
-> listensock = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0,
WSA_FLAG_OVERLAPPED);参数应该指定WSA_FLAG_OVERLAPPED 表示 为重叠
http://community.csdn.net/Expert/topic/4663/4663080.xml?temp=.1440088
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;
2.WSAOVERLAPPED acceptoverlapped[WSA_MAXIMUM_WAIT_EVENTS]; //每个client对应一个overlapp. 这个我知道。
3.设flags=0?在哪里设?
4.这个以后再考虑,先把这个问题搞定
我设flag=0后,返回错误为10014了
慢慢来,快了!!!