首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

Winsock I/O 阻塞模型,该如何处理

2012-02-28 
Winsock I/O 阻塞模型一个最简单的阻塞程序,为什么运行起来却不阻塞呢?程序一运行就直接ALLDONE了,它不是

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 ");
}

热点排行