求SOCKET重叠模型结构定义示例代码.该怎么解决
求SOCKET重叠模型结构定义示例代码.............
小猪的手把手教你玩转SOCKET模型之重叠文章看了,程序也下了感觉真的很不错,
但是猪哥的WSASEND部分没有示例,我调起来很困难,各位帮帮忙,最好有完整的示例代码,
谢过!
------解决方案--------------------
WSASend和WSARecv的用法没有太大差别,你可以参考他的WSARecv代码
------解决方案--------------------
小猪的手把手教你玩转SOCKET模型之重叠文章看了,程序也下了感觉真的很不错,
但是猪哥的WSASEND部分没有示例,我调起来很困难,各位帮帮忙,最好有完整的示例代码,
谢过!
------解决方案--------------------
WSASend和WSARecv的用法没有太大差别,你可以参考他的WSARecv代码
------解决方案--------------------
- C/C++ code
#include "stdafx.h" WSAOVERLAPPED AcceptOverlapped[10]; SOCKET s,c; int i; WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS]; WSABUF DataBuf; DWORD dwEventTotal, // 程序中事件的总数 dwRecvBytes, // 接收到的字符长度 Flags; // WSARecv的参数 void CALLBACK WorkRoutine(DWORD error,DWORD BytesTransferred,LPWSAOVERLAPPED Overlapped, DWORD InFlags){ DWORD SendBytes; DWORD RecvBytes; DWORD Flags; if(error != 0 || BytesTransferred == 0){ cout<<error<<endl; closesocket(c); return; } cout<<DataBuf.buf<<endl; return ; } DWORD WINAPI _AcceptProc(LPVOID lpParameter){ // c = WSASocket(AF_INET,SOCK_STREAM,0,NULL,NULL,WSA_FLAG_OVERLAPPED); SOCKET *s = (SOCKET*)lpParameter; char buffer[1024]; if(i == 10 ){ cout<<"客户连接已满"<<endl; shutdown(c,2); closesocket(c); i--; if(i == 0){ cout<<"以清空"<<endl; return 0; } return 0; } ZeroMemory(&buffer,sizeof(buffer)); DataBuf.buf = buffer; DataBuf.len = sizeof(buffer); while(1){ c = accept(*s,NULL,NULL); if(c == INVALID_SOCKET){ cout<<"Accept错误"<<endl; cout<<WSAGetLastError()<<endl; return 0; } ZeroMemory(&AcceptOverlapped[i],sizeof(AcceptOverlapped)); if(i == 0){ if( WSARecv(c,&DataBuf,1,&dwRecvBytes,&Flags,&AcceptOverlapped[i],WorkRoutine) == SOCKET_ERROR){ if(WSAGetLastError() != WSA_IO_PENDING){ cout<<"WSARecv failed with error"<<WSAGetLastError()<<endl; closesocket(c); WSACloseEvent(EventArray[dwEventTotal]); return 0; } } } i++; Sleep(500); } // CreateThread(NULL,0,_AcceptProc,s,0,NULL); return 0; } DWORD WINAPI _InterestEventProc(LPVOID lpParameter){ return 0; } int main(int argc, char* argv[]) { WSADATA wsaData; SOCKET s; sockaddr_in service,client; WORD Version = MAKEWORD(2,2); DWORD ThreadID; EventArray[dwEventTotal] = WSACreateEvent(); //lAcceptOverlapped.hEvent = EventArray[dwEventTotal]; dwEventTotal ++; WSAStartup(Version,&wsaData); s = WSASocket(AF_INET,SOCK_STREAM,0,NULL,NULL,WSA_FLAG_OVERLAPPED); if(s == INVALID_SOCKET){ cout<<"WSASocket错误"<<endl; cout<<WSAGetLastError()<<endl; getch(); WSACleanup(); return 0; } service.sin_addr.S_un.S_addr = INADDR_ANY; service.sin_family = AF_INET; service.sin_port = htons(5150); if( bind(s,(sockaddr*)&service,sizeof(sockaddr_in)) == SOCKET_ERROR){ cout<<"bind 错误"<<endl; cout<<WSAGetLastError()<<endl; getch(); WSACleanup(); return 0; } listen(s,10); CreateThread(NULL,0,_AcceptProc,&s,0,NULL); DWORD dwIndex = 0, dwBytesTransferred; while(1){ dwIndex = WSAWaitForMultipleEvents(dwEventTotal,EventArray,false,2000,true); if(dwIndex == WSA_WAIT_TIMEOUT){ cout<<"超时"<<endl; continue; } if(dwIndex == WAIT_IO_COMPLETION){ cout<<"IO完成"<<endl; break; } dwIndex = dwIndex - WSA_WAIT_EVENT_0; if(dwIndex == 0){ cout<<"连入一个用户"<<endl; continue; } WSAResetEvent(EventArray[dwIndex]); WSAGetOverlappedResult(s,&AcceptOverlapped[i],& dwBytesTransferred,false,&Flags); if(dwBytesTransferred == 0){ cout<<"数据流量0关闭"; closesocket(s); WSACloseEvent(EventArray[dwIndex]); // 关闭事件 return 0; } Sleep(500); } getch(); WSACloseEvent(EventArray[dwEventTotal]); closesocket(s); WSACleanup(); return 0; }