我的程序这样写的:
监听某一端口
如果来了一个数据 则建立一个socket ,并新建一个线程,此线程单独处理这个socket的数据
--问题--
多线程中使用recv没有什么问题。。 可以各自正常运作。
但如果send 的时候,只有第一个send的线程将数据发出去,其他线程就发不出去了。
这个是不是端口被占用了呢? 请问该如何处理。。--部分代码--WSADATA  wsaData;  
int  iRet=WSAStartup(MAKEWORD(2,2),&wsaData);  
if(iRet!=NO_ERROR)  
{
erroroutput("wsastartup失败");
return;
}
SOCKET  m_socket;  
m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);  
if(m_socket==INVALID_SOCKET)  
{  
erroroutput("socket创建失败"); 
WSACleanup();
return  ;  
           }  
 
           //创建一个端口   //找到本机IP char HostName[80];   
            LPHOSTENT lpHostEnt;   
            struct in_addr addr;   
if(gethostname(HostName,sizeof(HostName))==SOCKET_ERROR)   
            {     //     得到本主机名   
             erroroutput("获取主机名失败"); 
               return;
            }   
lpHostEnt=gethostbyname(HostName);//利用得到的主机名去获得主机结构   
            if(!lpHostEnt)   
            {   
                erroroutput("获取IP失败"); 
                    return     ;   
            }     
memcpy(&addr,lpHostEnt->h_addr_list[1],sizeof(in_addr));  CString myip=inet_ntoa(addr);
 
           sockaddr_in  service;  
           service.sin_family=AF_INET;  
           service.sin_addr.s_addr=inet_addr(myip);  
           service.sin_port=htons(PORT);  
 
           if(bind(m_socket,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)  
           {  
                        erroroutput("端口创建失败"); 
 
                       closesocket(m_socket);  
                       return   ;  
           }  
           else  
   {
 
                       
   }
 
           //监听一个连接
           if(listen(m_socket,SOMAXCONN)==SOCKET_ERROR)  
                        erroroutput("端口监听失败"); 
           else  
                      erroroutput(myip+"上的端口创建成功,现已开始监听端口"); 
 
           //accept  a  connection  
           SOCKET  AcceptSocket;    
   //开始等待连接
   while(1)  
           {  
   
  socketdb tsocket;//构造一个socket的结构体
  int addrlen;
  addrlen=sizeof(tsocket.name);    AcceptSocket=SOCKET_ERROR;
  while(AcceptSocket==SOCKET_ERROR) 
  {  
     AcceptSocket=accept(m_socket,(struct sockaddr *)&tsocket.name,&addrlen);
 
  }  
 
  tsocket.socketname=AcceptSocket;   DWORD  dwThreadId; 
  HANDLE  hThread; 
  
  hThread=CreateThread(NULL,NULL,AnswerThread,(LPVOID)&tsocket,0,&dwThreadId); 
  if(hThread==NULL)
  { 
  erroroutput("创建接受线程失败"); 
  }  
  else 
  {  
  //erroroutput("创建接受线程成功" ); 
  }  
   }  
           return  ;  -------线程部分-----------DWORD WINAPI   AnswerThread(LPVOID  lparam)  
{  
 
socketdb *clientsocketsc=(socketdb *)lparam;
SOCKET  ClientSocket=clientsocketsc->socketname; 
 

  
 
 
  int bytesRecv=0;
  byte   recvbuf[SIZEDATA]="";  //每次接收到的数据包的缓存
  int newpage=0;  //文件缓存中的字节数
  byte  newpagebuf[SIZEFILE]="";  //每次的数据文件的缓存
  
  
  int pagesize=0;
  
  //加入BLOB类型的数据
  
  CString reslut="";
  int insertok=0;
while( bytesRecv != SOCKET_ERROR && insertok==0) 
{  //Receiving Data

bytesRecv=recv(ClientSocket,(char *)recvbuf,sizeof(recvbuf),0);
 if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET )
 {
  erroroutput("连接断开");
 break;
 } 

解决方案 »

  1.   

    对于接收回来的连接,不会有端口的限制,LZ可以查看 send 的返回值来确认出错的可能性
      

  2.   

    在其他的线程那里   执行到send后,就在send那里不动了,不执行后面的语句了。估计是在等待端口释放吧?
    bytesSent = send(ClientSocket,(char *)sendbuf,28,0);erroroutput("已经将数据包发送出去,"+tip+":"+temp);
      

  3.   

    在阻塞模式下,如果对方没有收到的话,那么send是有可能被阻塞的。
      

  4.   

    应该说是对方没有调用recv/recvfrom/WSARecv/WSARecvFrom
    最容易产生此类问题的情况是,两端都在send