读书人

用SendTo函数发送数据返回异常WSAENOT

发布时间: 2012-01-06 22:55:18 作者: rapoo

用SendTo函数发送数据返回错误WSAENOTSOCK,什么原因呢?
函数代码如下:
void ESocket::sendToserver(int type,CString mpass,CString mid)
{
Clogin logdlg;
stMessage sendbuf;
sendbuf.iMessageType = LOGIN;
//logdlg.m_PASS = logdlg.GetDlgItemText
//logdlg.UpdateData(TRUE);
logdlg.m_PASS = mpass;
logdlg.m_ID = mid;
for(int i = 0;i <logdlg.m_PASS.GetLength();i++)
sendbuf.message.loginmember.password[i] = logdlg.m_PASS[i];
for(int j = 0;j <logdlg.m_ID.GetLength();j++)
sendbuf.message.loginmember.userName[j] = logdlg.m_ID[j];//
/////////////////////////////////////////
char L_serverip[10] = "127.0.0.1 ";
memcpy(serverip,L_serverip,10);
sockaddr_in server;
server.sin_addr.S_un.S_addr = inet_addr(serverip);
server.sin_family = AF_INET;
server.sin_port = htons(SERVER_PORT);
int sendcharacters;
static int errorcode;
//sendcharacters = SendTo((const char*)&sendbuf,sizeof(sendbuf),(const SOCKADDR*)&server,sizeof(server));//向服务器发送登陆信息
sendcharacters = SendTo((const char*)&sendbuf,sizeof(sendbuf),SERVER_PORT,serverip);
errorcode = GetLastError();
}

[解决办法]
你自已的socket句柄不效,也就是你邦定本地的那个套接字句柄。

在发送之前先判断一下本地的套接字句柄。
[解决办法]
自始至终,没看到socket的影子阿

据我判断,你的SendTo底层包含了对WinSock函数send或者sendto的调用
而send和sendto函数的第一个参数就是SOCKET s;
这个SOCKET s是通过调用socket函数返回的,例如:
SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(s == INVALID_HANDLE)
{
//error
return;
}
int retVal = send(s, lpBuf, bufLen);

[解决办法]
你的这个ESocket类的初始化函数(init|create|构造函数)里边是否有

类似s = socket(AF_INET, SOCK_DGRAM, 0);这样的代码。可能需要显式的调用一下初始化函数。

另外你的代码
sendcharacters = SendTo((const char*)&sendbuf,sizeof(sendbuf),SERVER_PORT,serverip);
errorcode = GetLastError();

调用GetLastError()是不对的,应该调用WSAGetLastError()

读书人网 >VC/MFC

热点推荐