首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络协议 >

多线程接收有关问题

2013-10-21 
多线程接收问题本帖最后由 u010331424 于 2013-10-19 17:06:52 编辑程序启动时没问题,但一有连接立刻就出

多线程接收问题
本帖最后由 u010331424 于 2013-10-19 17:06:52 编辑 程序启动时没问题,但一有连接立刻就出错。

static int connections=0;
struct threadData{
SOCKET clientsock;
int ID;
};

threadData *SockID=new(threadData);
threadData *SockRev=new(threadData);


void main()
{
SOCKET sock, clientSocket;                   
int port;
cout<<"Port"<<endl; cin>>port;
DWORD WINAPI work(LPVOID lpParameter);



WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 0 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) 
{
cout<<"Socket2.0初始化失败,Exit!";
return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||HIBYTE( wsaData.wVersion ) != 0 ) 
{
WSACleanup( );
return; 
}


sock = socket(
AF_INET,          
SOCK_STREAM,      
0                
);

if (sock == INVALID_SOCKET ) 
{
cout<<"Socket 创建失败,Exit!";
return;
}


sockaddr_in myaddr; 
memset(&myaddr,0,sizeof(myaddr));
myaddr.sin_family=AF_INET;

myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
myaddr.sin_port=htons(port);     
bind(sock,(sockaddr*)&myaddr,sizeof(myaddr));


sockaddr_in addrto;           
memset(&addrto,0,sizeof(addrto));

if (listen(sock,2) == SOCKET_ERROR )
{
closesocket(sock);
WSACleanup();
abort();
}
else
{
cout<<"listen succeed!"<<endl;
}


// accept 对方连接
while(1){
int nlen = sizeof(addrto);
int IDs=1; //
memset(SockID,0,sizeof(SockID));
clientSocket = accept(sock,(sockaddr*)&addrto,&nlen);
if (clientSocket < 0)
{
cout<<"client socket error!"<<endl;

continue;
}
else
   {    //程序在这里出问题,一直cout “accepted client error”
cout<<"accepted client socket!"<<endl;
SockID->clientsock=clientSocket;
SockID->ID=IDs;
CreateThread(NULL,0,&work,SockID,0,NULL);
connections++;
IDs++;
   }
}
if (!closesocket(sock)) 
{
WSAGetLastError();
return;
}
if (!WSACleanup()) 
{
WSAGetLastError();
return;
    }
}

         //处理线程
DWORD WINAPI work(LPVOID lpParameter)
  {

 memset(&SockRev,0,sizeof(SockRev));
  SockRev=(threadData*)lpParameter;

while(true)
{
Sleep(1000);
 char szMsg[100];
cin.getline(szMsg,100);
if( send(SockRev->clientsock, szMsg, strlen(szMsg), 0)== SOCKET_ERROR ) {
cout<<"error, error id = "<<WSAGetLastError()<<endl;

cout<<"client disconnected"<<endl;
connections--;
closesocket(SockRev->clientsock);
break;
}
else

cout<<"Message Send to "<<SockRev->ID<<endl;
}
  

if (!closesocket(SockRev->clientsock)) 
{
WSAGetLastError();
return 1;
}
if (!WSACleanup()) 
{
WSAGetLastError();
return 1;
}

return 0;
}

[解决办法]
那就说明没服务端没有问题!客户成功连接了,确认下你的客户端代码的问题

热点排行