读书人

多线程接收有关问题

发布时间: 2013-10-21 17:02:52 作者: rapoo

多线程接收问题
本帖最后由 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;
}

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

读书人网 >网络协议

热点推荐