小弟刚学winsock,仿照别人的程序做了一个echo程序,运行时能看到客户端的IP及端口,但却接受不到客户端发来的数据,总是提示:recv() failed:10038  ,返回值为-1.服务端程序如下,请各位帮忙看一下,是什么地方有问题,先谢过了.
#pragma comment(lib, "WS2_32.lib")
#include <winsock.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<iostream.h>#define MaxCon   5       /*maxinum connection*/
#define BUFSIZE 4096
#define DEFAULT_PORT 2008
#define WSVERS MAKEWORD(2,0)BOOL    bRecvOnly  = FALSE;  // Receive data only; don't echo back
void errexit(const char * format,...);
DWORD WINAPI ClientThread(LPVOID lpParam);int main( int argc , char *argv[])
{
char *service="echo";
struct sockaddr_in Serveraddr;
int Sock_listen,type,bindOK;
HANDLE        hThread;
    DWORD        dwThreadId; WSADATA wsadata;
if(WSAStartup(WSVERS,&wsadata)!=0)
errexit("WSAStartup failed\n");
type=SOCK_STREAM;
Sock_listen=socket(PF_INET,type,0);
if (Sock_listen == INVALID_SOCKET) 
errexit("can't create socket: %d\n", GetLastError());  memset(&Serveraddr,0,sizeof(Serveraddr));
Serveraddr.sin_family=AF_INET;
Serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
Serveraddr.sin_port=htons(DEFAULT_PORT);

bindOK=bind(Sock_listen,(struct sockaddr *)&Serveraddr,sizeof(Serveraddr));
if (bindOK != 0) 
errexit("can't create binding: %d\n", GetLastError());  if(listen(Sock_listen,MaxCon)!=0)
errexit("can't create listening: %d\n", GetLastError()); struct sockaddr_in Clientaddr;
    SOCKET client;
int clilen=sizeof(Clientaddr);
    
    while(true)
    {
        char temp[BUFSIZE];        client=accept(Sock_listen,
            (struct sockaddr*)&Clientaddr,&clilen);
        printf("visited client: %s:%d\n", 
            inet_ntoa(Clientaddr.sin_addr), ntohs(Clientaddr.sin_port));
        
        sprintf(temp,"Your IP is %s:%d\r\n",inet_ntoa(Clientaddr.sin_addr), ntohs(Clientaddr.sin_port));
        send(client,temp,strlen(temp),0); strcpy(temp,"hello!this is the server!");
send(client,temp,strlen(temp),0);
        
hThread = CreateThread(NULL, 0, ClientThread, 
(LPVOID)client, 0, &dwThreadId);
        if (hThread == NULL)
        {
            printf("CreateThread() failed: %d\n", GetLastError());
            break;
        }
        CloseHandle(hThread);        closesocket(client);
    }    closesocket(Sock_listen);
    WSACleanup();    
    return 0;
}
DWORD WINAPI ClientThread(LPVOID lpParam)
{
    SOCKET        s=(SOCKET)lpParam;
    char          Buf[BUFSIZE+1];
    int           ret,nLeft,px;
printf("Thread open,socket is %d",s);
    while(true)
    {
        ret = recv(s, Buf, BUFSIZE, 0);
printf("here ret is%d",ret);
        if (ret == 0)        
            break;
        else if (ret == SOCKET_ERROR)
        {
            printf("recv() failed: %d\n", WSAGetLastError());
            break;
        }
        Buf[ret] = '\0';
        printf("RECV: '%s'\n", Buf);        if (!bRecvOnly)
        {
            nLeft = ret;
            px = 0;            while(nLeft>0)
            {
                ret = send(s, &Buf[px], nLeft, 0);
                if (ret == 0)
                    break;
                else if (ret == SOCKET_ERROR)
                {
                    printf("send() failed: %d\n", 
                        WSAGetLastError());
                    break;
                }
                nLeft -= ret;
                px += ret;
              }
        }
    }
    return 0;
}
 void errexit(const char * format,...)
{
va_list args;
va_start(args,format);
vfprintf(stderr,format,args);
va_end(args);
WSACleanup();
exit(1);
}

解决方案 »

  1.   

    ........
            closesocket(client);
        }
    改为
        }
        closesocket(client);
      

  2.   

    应该没有,客户端也是自己写的
    建立连接后,代码如下
    char buf[BUFSIZE+1];
    SOCKET s;
    int ret; s=ConTCP(PServerIp,PServerPort); while(fgets(buf,sizeof(buf),stdin))
              {
           ret = recv(s, buf,BUFSIZE, 0);
                    if (ret == 0)       
                          break;
                    else if (ret == SOCKET_ERROR)
                   {
                printf("recv() failed: %d\n", WSAGetLastError());
                         break;
                   }
               buf[ret] = '\0';
               printf("RECV [%d bytes]: '%s'\n", ret, buf);
    }
      closesocket(s);
      

  3.   

    客户端一直在循环中,没有关闭socket
    应该没有问题
    麻烦大家帮忙看看
      

  4.   

    谢谢zottff() ,我把...
            closesocket(client);
        }
    改为
        }
        closesocket(client);10038的错误已经没有了
    但不知为何,在线程里还是不能接收到客户端发来的数据
    继续求助...