Winsock I/O 阻塞模型
一个最简单的阻塞程序,为什么运行起来却不阻塞呢 ?
程序一运行就直接ALL DONE了,它不是应该等待数据的到来才可以All Done么 ?
还是我对阻塞模型的理解有误?请大侠指点迷津。。。感谢~!
以下附最简单的阻塞程序:
-------------------------
int main(int argc, char* argv[])
{
cout.width(40);
cout < < "阻塞模式I/O实验 " < < endl;
//init WSA Ver
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2, 2), &wsaData))
{
cout < < "WSA Ver ERROR! " < < endl;
return 0;
}
//init SOCKET
SOCKET s;
SOCKADDR_IN ServerAddr;
int port = 5210;
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(port);
ServerAddr.sin_addr.s_addr = inet_addr( "192.168.1.63 ");
SOCKET Client;
SOCKADDR_IN ClientAddr;
bind(Client, (SOCKADDR*)&ClientAddr, sizeof(ClientAddr));
listen(Client, 5);
SOCKET Conn;
int ClientLen = sizeof(ClientAddr);
Conn = accept(Client, (SOCKADDR*)&Client, &ClientLen);
closesocket(Conn);
closesocket(Client);
closesocket(s);
WSACleanup();
cout < < "ALL Done! " < < endl;
system( "pause ");
}
[解决办法]
服务器bind的地址不对,应该bind本机上可用的ip地址。
用WSAGetLastError看错误码是多少
[解决办法]
bind错了
bind(s, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr));
listen(s, 5);
SOCKET Conn;
int ClientLen = sizeof(ServerAddr);
Conn = accept(s, (SOCKADDR*)&s, &ClientLen);
if (Conn == INVALID_SOCKET) {
int iError = WSAGetLastError();
cout < < "ERROR ID = [ " < < iError < < "] " < < endl;
return -1;
}
[解决办法]
MSDN上有的哦 查WSAGetLastError 函数 然后 See Winsock Error Codes.
[解决办法]
另外 SOCKET Client 没有初始化哦
[解决办法]
int main(int argc, char* argv[])
{
cout.width(40);
cout < < "阻塞模式I/O实验 " < < endl;
//init WSA Ver
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2, 2), &wsaData))
{
cout < < "WSA Ver ERROR! " < < endl;
return 0;
}
//init SOCKET
SOCKET s;
sockaddr_in ServerAddr;
int port = 5210;
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(port);
ServerAddr.sin_addr.s_addr = inet_addr( "127.0.0.1 ");
//SOCKET Client;
SOCKADDR_IN ClientAddr;
//第一个参数换成SOCKET s;
if( bind(s, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr))== SOCKET_ERROR)
{
cout < < "绑定失败! " < < endl;
return 0;
}
//第一个参数换成SOCKET s;
if(listen(s, 1)==SOCKET_ERROR)
{
cout < < "监听失败! " < < endl;
return 0;
}
SOCKET Conn;
int ClientLen = sizeof(sockaddr);
//这个才是Client的SOCKET
Conn = accept(s, (SOCKADDR*)&s, &ClientLen);
closesocket(Conn);
//closesocket(Client);
closesocket(s);
WSACleanup();
cout < < "ALL Done! " < < endl;
system( "pause ");
}