专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 网络通信

非阻塞EWOULDBLOCK的有关问题

发布时间:2011-07-03 07:13:48 文章来源:www.iduyao.cn 采编人员:星星草
非阻塞EWOULDBLOCK的问题
服务器使用select模型,当客户端有连接后,用if (FD_ISSET(clientSocket,&read_set))判断是否有读操作,结果客户端没发任何数据,但这个判断一直为true,使用recv接收数据,返回值一直小于0,并且是EWOULDBLOCK,请问这个问题是否正常?如果不正常如何处理?

------解决方案--------------------
C/C++ code

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;

BOOL InitSocket()
{
    WSADATA wsaData;
    WORD wVersionRequested;
    int err=0;
    wVersionRequested=MAKEWORD(2,2);
    err=WSAStartup(wVersionRequested,&wsaData);
    if(err!=0)
    {
        cout<<"Could not find a usage WinSock DLL"<<GetLastError()<<endl;
        return false;
    }

    if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2)
    {
        cout<<"Could not find a usage WinSock DLL"<<GetLastError()<<endl;
        WSACleanup();
        return false;
    }
    return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
    if(!InitSocket())
        return -1;

    SOCKET ListenSock;
    SOCKET AcceptSock;
    SOCKADDR_IN InterAddr;
    ListenSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    InterAddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    InterAddr.sin_family=AF_INET;
    InterAddr.sin_port=htons(8000);

    if(ListenSock==INVALID_SOCKET)
    {
        cout<<"A error ocured while build a socket"<<GetLastError()<<endl;
        closesocket(ListenSock);
        WSACleanup();
        return -1;
    }

    if(bind(ListenSock,(sockaddr *)&InterAddr,sizeof(sockaddr))==SOCKET_ERROR)
    {
        cout<<"A error ocured while binding a socket"<<GetLastError()<<endl;
        closesocket(ListenSock);
        WSACleanup();
        return -1;
    }

    if(listen(ListenSock,5)==SOCKET_ERROR)
    {
        cout<<"A error ocured while listening on a socket"<<GetLastError()<<endl;
        closesocket(ListenSock);
        WSACleanup();
        return -1;
    }
    char sendbuf[512]={'\0'};
    char recvbuf[512]={'\0'};
    fd_set fd_read,fd_write;
    FD_ZERO(&fd_read);
    FD_ZERO(&fd_write);
    TIMEVAL timeout;
    timeout.tv_sec=13;
    timeout.tv_usec=0;
    int ret=0;
    int bytes_recv;
    AcceptSock=accept(ListenSock,NULL,NULL);
    if(AcceptSock==INVALID_SOCKET)
    {
        cout<<"A error ocured while accept connect request from client"<<GetLastError()<<endl;
        closesocket(ListenSock);
        closesocket(AcceptSock);
        WSACleanup();
        return -1;
    }
    while(true)
    {
        FD_SET(AcceptSock,&fd_read);
        FD_SET(AcceptSock,&fd_write);
        ret=select(NULL,&fd_read,&fd_write,NULL,&timeout);
        if(ret==SOCKET_ERROR)
            continue;
        if(ret>0)
        {
            if(FD_ISSET(AcceptSock,&fd_read))
            {
                if((bytes_recv=recv(AcceptSock,recvbuf,sizeof(recvbuf),NULL))==SOCKET_ERROR)
                {
                    cout<<"A error ocured while receive data from client"<<GetLastError()<<endl;
                    closesocket(AcceptSock);
                    closesocket(ListenSock);
                    WSACleanup();
                    return -1;
                }
                else
                    cout<<recvbuf<<endl;
            }
            else 
            {
                if(FD_ISSET(AcceptSock,&fd_write))
                {
                    gets(sendbuf);
                    if(send(AcceptSock,sendbuf,sizeof(sendbuf),NULL)==SOCKET_ERROR)
                    {
                        cout<<"A error ocured while send data to client"<<GetLastError()<<endl;
                        closesocket(AcceptSock);
                        closesocket(ListenSock);
                        WSACleanup();
                        return -1;
                    }
                }
            }

        }
    }
    return 0;
}
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: