是服务器端呢?还是客户端?WINSOCK编程要先考虑好通信的目的,然后是通信的内容,确定需要的方式,是否该使用C/S结构。

解决方案 »

  1.   

    我的方法是用在线程里阻塞调用Socket
      

  2.   

    请sxbyl老兄能说明白一点吗,我用过ioctlsocket设置阻塞,但也不行,谢谢!
      

  3.   

    下面是我一个程序的一部分
    int nTotalRecv,nTotalSend,nTemp;
    u_long ulOpt=0;
    SOCKET hSocket=NULL;
    SOCKADDR_IN sockServerAddr;
    SOCKADDR_IN sockClientAddr;
    ZeroMemory(&sockServerAddr,sizeof(SOCKADDR_IN));
    ZeroMemory(&sockClientAddr,sizeof(SOCKADDR_IN));
    ZeroMemory(&struResponseInfo,sizeof(tagServerResponseInfo));
    sockServerAddr.sin_family=AF_INET;
    sockServerAddr.sin_addr.s_addr=inet_addr(strServerIP);
    sockServerAddr.sin_port=htons(SOCKET_PORT);
    sockClientAddr.sin_family=AF_INET;
    sockClientAddr.sin_port=htons(0);
    sockClientAddr.sin_addr.s_addr=htonl(INADDR_ANY);
    try
    {
    hSocket=socket(AF_INET,SOCK_STREAM,0);
    if(hSocket==INVALID_SOCKET)
    {
    throw(EXCEPTION_CREATE_SOCKET);
    }
    if(ioctlsocket(hSocket,FIONBIO,&ulOpt)==SOCKET_ERROR)
    {
    throw(EXCEPTION_SET_SOCKET);
    }
    if(bind(hSocket,(PSOCKADDR)&sockClientAddr,sizeof(SOCKADDR_IN))==SOCKET_ERROR)
    {
    throw(EXCEPTION_BIND_SOCKET);
    }
    if(connect(hSocket,(PSOCKADDR)&sockServerAddr,sizeof(SOCKADDR_IN))==SOCKET_ERROR)
    {
    throw(EXCEPTION_CONNECT_SERVER);
    }
    nTotalSend=0;
    nTotalRecv=0;
    while(nTotalSend<sizeof(struValidInfo))
    {
    nTemp=send(hSocket,(char *)(&struValidInfo)+nTotalSend,
    sizeof(struValidInfo)-nTotalSend,0);
    if(nTemp==SOCKET_ERROR)
    {
    throw(EXCEPTION_SEND_DATA);
    }
    nTotalSend+=nTemp;
    }
      

  4.   

    谢谢sxbyl老兄,我写的是服务器端,设置阻塞也是采用你说的这种方式,但还是不行。
      

  5.   

    服务端也差不多,Listen之前的操作照常,当接收到Accept请求后,如下处理就行了
    (注意:因为本人比较懒,所以服务端采用的是CSocket+API,连入请求用CSocket,数据传输用API,好像有些怪异,呵呵~~)
    void CReportFormServerDlg::OnSockAccept(int nErrorCode,CSocketEx *pSock)
    {
    tagSocketThreadParam *pParam=NULL;
    u_long ulOpt=0;
    BOOL bFlag=TRUE;
    CSocketEx *pAgent=NULL;
    if(nErrorCode)
    {
    CString strTemp;
    strTemp.Format("当接收连接请求时发生%08x错误",nErrorCode);
    WriteLog(strTemp);
    return;
    }
    pAgent=new CSocketEx;
    if(pSock->Accept(*pAgent)==FALSE)
    {
    WriteError("当接收连接请求时");
    return;
    }
    pParam=new tagSocketThreadParam;
    pParam->pDlg=this;
    pParam->pSock=pAgent;
    pAgent->AsyncSelect(0);
    pAgent->IOCtl(FIONBIO,&ulOpt);
    pAgent->SetSockOpt(SO_KEEPALIVE,&bFlag,sizeof(BOOL));
    pAgent->AsyncSelect(FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
    AfxBeginThread(ThreadValidate,pParam);
    }
      

  6.   

    感谢各位大虾的帮忙,问题我已经解决了,感谢sxbyl老兄.