您的位置:首页 > 编程语言

Win Scoket编程中accpet 引起的一个问题

2007-05-07 15:10 381 查看
class CInitSock
{
public:
CInitSock(int version01 = 2, int version02 = 2)
{
WSADATA wsaData = {0};
WORD version = 0;

version = MAKEWORD(version01, version02);

if (WSAStartup(version, &wsaData) != 0)
{
cout << "Initlization failed....." << endl;
exit(0);
}
}

~CInitSock()
{
WSACleanup();
}
};

void ReceiveSocket()
{
SOCKET sockListen = 0;
SOCKET sockClient = INADDR_ANY;

int nAddrlen = 0;

sockaddr_in sin = {0};
sockaddr_in remoteAddr;

sin.sin_port = htons(80);
sin.sin_family = AF_INET;
sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

sockListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (bind(sockListen, (SOCKADDR*)&sin, sizeof(sin)) == SOCKET_ERROR)
{
DebugOut("bind failed", GetLastError());

return;
}

if (listen(sockListen, MAX_LISTEN)== SOCKET_ERROR)
{
DebugOut("listen failed", GetLastError());

return;
}

while (true)
{
//print message
DebugOut("run befor accept message", 0);
//end print

char szBuffer[MAX_RECEVIE_LEN] = "/0";
char* szReturn = NULL;

HANDLE hReturnThread = 0;

sockClient = accept(sockListen, (SOCKADDR*)&remoteAddr, &nAddrlen);

if (sockClient == INVALID_SOCKET)
{
DebugOut("accpt failed", GetLastError());

continue;
}

int nLen = recv(sockClient, szBuffer, MAX_RECEVIE_LEN, 0);
if (nLen == SOCKET_ERROR)
{
DebugOut("recv failed", GetLastError());

continue;
}

szReturn = new char(nLen);
strcpy(szReturn, szBuffer);

hReturnThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ReturnThread, (LPVOID)szReturn, 0, NULL);
CloseHandle(hReturnThread);
}
}

CInitsock myscok;

int main()
{
ReceiveSocket();

reuturn 0;
}

总是出现:accpt failed 10014

解决方案:
在MSDN中查到:
WSAEFAULT The addrlen parameter is too small or addr is not a valid part of the user address space.

只需要在调用accept()之前加上这么一个语句:
nAddrlen = sizeof(sockaddr_in);

错误的原因:
在2000年6月版的msdn里函数accept()的参数addrlen的属性是[out],而在2004年7月版的msdn里却是[in, out],故应该给该参数赋初值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐