客户端发送的数据为什么服务器端接收不到数据?在服务去端我开了一个线程专门接收数据。我的实现是一个客户端不断接收数据,而其它的客户端(3个)只发送数据(不定时的发送);
 程序:服务器端的
   sockSrv=socket(AF_INET,SOCK_STREAM,0);
   SOCKADDR_IN  addrSrv;
   addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
   addrSrv.sin_family=AF_INET;
   addrSrv.sin_port=htons(6000);
   bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,6);          HANDLE  hThread2; //创建线程
hThread2=CreateThread(NULL,0,Fun2Proc,&sockSrv,0,NULL);
CloseHandle(hThread2);   
 SOCKADDR_IN  addrClient;
int len=sizeof(SOCKADDR);
while(1)                                //接收数据
 {
SOCKET sockCon=accept(sockSrv,(sockaddr*)&addrClient,&len); char SendBuf[100]="WELCOME TO mfc!";
    send(sockCon,SendBuf,100,0); 
  closesocket(sockCon); 

}
}
   DWORD WINAPI Fun2Proc(LPVOID lpParameter)       //线程发送数据
{
SOCKET sockSrv=*((SOCKET*)lpParameter);
 SOCKADDR_IN  addrClient1;
int len1=sizeof(SOCKADDR);
while(1)
 {

 SOCKET sockCon=accept(sockSrv,(sockaddr*)&addrClient1,&len1);
char RecvBuf[100];
      recv(sockCon,RecvBuf,100,0);
  printf("%s\n",RecvBuf);

  closesocket(sockCon);

}
return 0;
}
谁帮我看看问题出在哪?

解决方案 »

  1.   

    首先,你主线程中的那个while和子线程中的作用上有啥区别吗?你这两个while中,都是accpet后,然后,接收或者发送数据。所以说,你在客户端,都要先connect,然后,接收或者发送数据,而且,在同一时刻,你只能有一个客户端工作。其他的连接都已经结束关闭了。
      

  2.   

    你得多了解下,socket的大概流程。accept只是用来建立连接的,你通信,是用的建立好的这个连接。所以,你要支持多个客户的话,你得新建一个保存这个连接的数组,然后,对每一个客户都新建立一个线程用来接收消息。
    主线程就只是用来做accpet、并建立接收消息的线程,并不用来接收消息。因为你个while是个无限循环,线程到里循环中,在accept的时候,阻塞,等待客户的连接。发送消息的话,更简单,只要你知道在数组中查找到客户端的socket,不论在那个线程里,都可以发送消息到相应的客户端。我手边没有例子,你最好找一个例子,看看。
    socket+多线程+多客户端,去csdn的下载里面,找找
      

  3.   


    while(1)
    {
      SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
      clientsocket[i]=sockconn;   //这个数组定义成公有的最简单
      createthread(); //把clientsocket[i]的地址传进去
      i+=1; 
    }
    //在程序运行结束的时候,关闭所有的socket。
    在子线程函数中,取到每一个socket,然后,按逻辑进行处理就可以了。
      

  4.   


    只要客户端没有把端口定死,是可以的,看来你对SOCKET的工作流程不大小解,刚开始学SOCKET吧,可以这么学,先试试无连接的WSAAsyncSelete模型(因为该模型在WINDOWS下最好用,最简单),然后用有连接的该模型,然后selete模型,event模型,多线程,多线程的EVENT模型,重叠IO模型,完成端口,
      

  5.   

    关键点: 你的主线程和子线程所 accept的连接不是同一个!你的构想是,一个连接请求过来之后,你先发送一个欢迎信息,然后接收客户的信息.但是你的代码所描述的是?主线程: 接到一个连接, 发送欢迎信息, 然后主线程没接收信息就把本次连接关闭了, 客户端本次连接过来的信息直接被你扔掉了.你创建的辅助线程是可以收到信息.但问题是两个线程用了同一个socket,你主线程里执行了accept, 这个socket就处于blocking状态, 你的辅助线程的accept怎么可能顺利执行呢?