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],故应该给该参数赋初值。
{
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],故应该给该参数赋初值。
相关文章推荐
- 10.2.0.5的一个bug引起的oracle E.S合同问题
- 使用网上流传的一个数据库连接池在Proxy.newProxyInstance处引起 java.lang.ClassCastException 问题的解决方法
- iOS一个简单的设置圆角不引起性能问题的分类
- 一个空行引起的阿里云负载均衡上部署https证书的问题
- memcpy(szTest, szBuf, sizeof(szTest) - 1);引起的一个超低概率core dump问题的定位------谁说用memcpy能代替strcpy?
- 由一个多线程共享Integer类变量问题引起的。。。
- Tomcat里antiResourceLocking的作用和引起的一个问题 .
- 一个包冲突引起的问题
- 解决一个因Bitmap引起的OOM问题
- 关于shtml页面include问题解决方案因为utf-8的BOM头引起的出现一个空行
- 一个由两个长的如此相像的字引起的问题
- 一个menuconfig 配置引起的致命问题——一生难忘!
- 内存不足引起的SIGKILL:一个缓冲区不断增长问题的定位与解决(解释SIGKILL原因)
- 由一个HADOOP_HOME and hadoop.home.dir are unset报错引起的window环境连接调试远程hadoop的一系列问题,hadoop版本 2.8
- new一个数组引起的问题
- 误删一个用户 引起数据不准确问题
- 由三目运算符 == ? : 引起的一个问题,醉了,基础不过关。记录一下,比较简单的一个问题,只是为了记录一下
- 动态链接库中分配内存引起的问题-- windows已在XX.exe中触发一个断点
- 一个包冲突引起的问题
- IE6中javascript数组声明语法错误引起的一个问题