代码如下
int main(int argc, char* argv[])
{
DWORD EventTotal = 0;
WSAOVERLAPPED OverlappedArray[5];
WSAEVENT EventArray[5];
WSABUF buff[5];
WSADATA wsaData;
SOCKET ListeningSocket,ConnSocketArray[5];;
SOCKADDR_IN ServerAddr;
char cbuff[5][5];
::WSAStartup(MAKEWORD(2,2) ,&wsaData );
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(8000);
ServerAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ListeningSocket = ::socket(AF_INET ,SOCK_STREAM ,IPPROTO_TCP );//<<windows网络编程>>上说socket函数默认支持重叠io的,是这样的吗? ::bind(ListeningSocket ,(LPSOCKADDR)&ServerAddr ,sizeof(ServerAddr)); ::listen(ListeningSocket ,5); bool ThreadStart = true; DWORD Flags ,threadId ,RecvBytes; while(EventTotal < 5)
{
ConnSocketArray[EventTotal] = ::accept(ListeningSocket ,NULL ,NULL);
EventArray[EventTotal] = ::WSACreateEvent();
ZeroMemory(&OverlappedArray[EventTotal],sizeof(WSAOVERLAPPED));
OverlappedArray[EventTotal].hEvent = EventArray[EventTotal]; buff[EventTotal].len = 5;
buff[EventTotal].buf = cbuff[EventTotal]; ::WSARecv(ConnSocketArray[EventTotal] ,&buff[EventTotal] ,1 ,&RecvBytes
,&Flags ,&OverlappedArray[EventTotal] ,NULL);
//进行到这步就出现10045错误,说是参考的对象种类不支持尝试的操作,why?
if( ::WSAGetLastError() != WSA_IO_PENDING )
{
cout<<::WSAGetLastError()<<endl;
::closesocket(ConnSocketArray[EventTotal]);
} EventTotal++;
...
...
以下代码略郁闷啊,都想了半天了,还是找不出原因,高手指教,分不够可加.
int main(int argc, char* argv[])
{
DWORD EventTotal = 0;
WSAOVERLAPPED OverlappedArray[5];
WSAEVENT EventArray[5];
WSABUF buff[5];
WSADATA wsaData;
SOCKET ListeningSocket,ConnSocketArray[5];;
SOCKADDR_IN ServerAddr;
char cbuff[5][5];
::WSAStartup(MAKEWORD(2,2) ,&wsaData );
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(8000);
ServerAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ListeningSocket = ::socket(AF_INET ,SOCK_STREAM ,IPPROTO_TCP );//<<windows网络编程>>上说socket函数默认支持重叠io的,是这样的吗? ::bind(ListeningSocket ,(LPSOCKADDR)&ServerAddr ,sizeof(ServerAddr)); ::listen(ListeningSocket ,5); bool ThreadStart = true; DWORD Flags ,threadId ,RecvBytes; while(EventTotal < 5)
{
ConnSocketArray[EventTotal] = ::accept(ListeningSocket ,NULL ,NULL);
EventArray[EventTotal] = ::WSACreateEvent();
ZeroMemory(&OverlappedArray[EventTotal],sizeof(WSAOVERLAPPED));
OverlappedArray[EventTotal].hEvent = EventArray[EventTotal]; buff[EventTotal].len = 5;
buff[EventTotal].buf = cbuff[EventTotal]; ::WSARecv(ConnSocketArray[EventTotal] ,&buff[EventTotal] ,1 ,&RecvBytes
,&Flags ,&OverlappedArray[EventTotal] ,NULL);
//进行到这步就出现10045错误,说是参考的对象种类不支持尝试的操作,why?
if( ::WSAGetLastError() != WSA_IO_PENDING )
{
cout<<::WSAGetLastError()<<endl;
::closesocket(ConnSocketArray[EventTotal]);
} EventTotal++;
...
...
以下代码略郁闷啊,都想了半天了,还是找不出原因,高手指教,分不够可加.
http://dev.csdn.net/develop/article/39/39122.shtm
http://dev.csdn.net/develop/article/39/39128.shtm
///////////////////////////////////是的
此处
buff[EventTotal].buf = cbuff[EventTotal];有误
你的
buff[EventTotal].len = 5;而你的cbuff[EventTotal]的长度为1
所以你应该定义char ch[5];buff[EventTotal].buf = ch;不能认为二维数据的cbuff[EventTotal]的长度为5
在这里你没有指定相应的消息机制。所以会出现问题