为何用wsasocket成功创建的socket,而调用wsasend会说无效的socket?????
我用完成端口写的一个客户端程序,开始用::WSASocket()创建一个socket,没有错误
然后用connect与服务器连接,也没有错误,可是就在调用wsasend时,返回错误,
调用wsagetlasterror返回错误代码10038,查资料说10038—WSAENOTSOCK
Socket operation on an invalid socket. This error can be returned from any Winsock
function that takes a SOCKET handle as a parameter. This error indicates that the
supplied socket handle is not valid.可是我的socket创建是好的?????
怎么会这样,快帮帮我
bool CIOCPClient::AddNewModule(const CMInfo &info)
{ /////////////////////////////////////////////////////////////////////////
//创建modulecontext并连接
CModuleContext *pModule=AllocateContext();
SOCKET socMdl=::WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
if (socMdl == INVALID_SOCKET)
{
CString err;
string sss;
err.Format(_T("ERROR(AddNewModule()):Can't create basic ModuleContext's socket.SOCKETERROR=%ld\n"),::WSAGetLastError());
AfxMessageBox(err);
closesocket(socMdl);
return false;
}
//与module建立连接
int port=9000;
SOCKADDR_IN moduleIP;
moduleIP.sin_family=AF_INET;
moduleIP.sin_port=htons(port);
moduleIP.sin_addr.s_addr=inet_addr("200.205.4.194");//info.m_IpAddr.sin_addr;
int nRet=connect(socMdl,(SOCKADDR*)&moduleIP,sizeof(moduleIP));
if(nRet==SOCKET_ERROR){
CString err;
err.Format(_T("ERROR(AddNewModule):can't connect to module %s,error %d"),info.m_IpAddr.IPAddr,::WSAGetLastError());
AfxMessageBox(err);
::closesocket(socMdl);
return false;
}
//与iocp建立连接
if(AssociateSocketWithIOCP(socMdl,m_hIOCP,(DWORD)pModule)==false){
TRACE("\nCAN'T ASSOCIATE WITH SOCKET AND IOCP");
return false;
}
//////////////////////////////////////////////////////////////////////
m_csModuleMap.Lock();
//连接建立,加入module map
m_mapModule.insert(make_pair(info.m_ModuleAddr,pModule));
//m_mapMonitor.insert(make_pair(info.m_ModuleAddr,pMonitor));
m_csModuleMap.Unlock();
//初始化module模块
CModuleCommand *p=new CModuleCommand;//will be delete in main thread
p->CommandType(CModuleCommand::INITI_SETUP);
//setup message prefix to be open
string command("w1601");
p->Command(command);
//for debug;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OVERLAPPED_PLUS *op=AllocateOLPlus();
op->Type(IOWrite);
//op->Command(p);
ULONG ulFlags = MSG_PARTIAL;
DWORD dwIoSize;
pModule->m_wsaOutBuf.buf=(char *)pModule->m_writeBuf.GetBuffer();
pModule->m_wsaOutBuf.len=pModule->m_writeBuf.GetBufferLen();
SOCKET socket=pContext->Socket();
int nRetVal = ::WSASend(socMdl,
&pModule->m_wsaOutBuf,
1,
&pModule->m_wsaOutBuf.len,
0,
&op->m_ol,
NULL);
//返回-1,产生错误,用WSAGetLastError(),取得10038,说无效的socket,
//可是前面创建和连接都没有问题,如果ip地址错了,会产生这个错误?吗
//在debug下socMdl有值,为700左右的数值,按理创建是对的,
if (nRetVal == SOCKET_ERROR && WSAGetLastError() != WSA_IO_PENDING)
{
CString err;
err.Format(_T("ERROR:When calling WSARecv on module c=%c,r=%c,s=%c,SOCKETERR=%ld"),
pModule->ModuleInfo().m_ModuleAddr.Cluster(),
pModule->ModuleInfo().m_ModuleAddr.Rack(),
pModule->ModuleInfo().m_ModuleAddr.Slot(),
::WSAGetLastError());
AfxMessageBox(err);
//p->Error(err.operator LPCTSTR());
//p->SetEvent();
//::PostMessage(this->m_pFrame->m_hWnd,WM_USER_IOCP_NOTIFY,NC_COMMAND_DONE,(long)pContext);
return false;
//?删除该module?
//pThis->RemoveStaleClient( lpClientContext, FALSE );
}
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SendCommand(info.m_ModuleAddr,p);
return true;
}