为何用wsasocket成功创建的socket,而调用wsasend会说无效的socket?????

oxygens 2003-05-23 11:52:49



我用完成端口写的一个客户端程序,开始用::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;
}
...全文
167 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
solar 2003-05-25
  • 打赏
  • 举报
回复
刚刚发现原因正想来恢复,没想到楼主已经自己解决了
oxygens 2003-05-25
  • 打赏
  • 举报
回复
还是谢谢solar呀,overlapped要初始为零怎么书上什么都没说?太奇怪了,
oxygens 2003-05-24
  • 打赏
  • 举报
回复

我在打开socket后,又试了send,一切都好,服务器可以收到发出的数据报,可就是不能用wsasend 和wsarecv,
我以为是connect的问题,又换用wsaconnect,还是以前的问题10038???????????
我要疯了,马上要答辩了,结果卡在这,有那位高手用过socket打开然后connect,后可以用ovlapped的函数的
请指教,是不是就不能在客户端connect后,用wsa...函数??????
还有客户端可以用iocp吗?


oxygens 2003-05-24
  • 打赏
  • 举报
回复
啊,经过这两天的折么,终于找到了,原来是我继承自overlapped的类没有在constructor中调用zeromemory,可恶的wsagetlasterror,竟会报socket有误,搞得我要疯了

18,356

社区成员

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

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