多线程接收问题
本帖最后由 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;
}
[解决办法]
那就说明没服务端没有问题!客户成功连接了,确认下你的客户端代码的问题