我没有MFC的 ,所以不要给我MFC的例子 
两台电脑间的我可以单向传输了 ,但是客户端收数据时还会退出,打牌要4个人,
ClientSocket=accept(ListenSocket,(SOCKADDR*)&ClientAddr,&AddrLen); 
服务器也 参与玩的,这句是服务器上的,执行到此后就不动了 要 别人connect才能继续.
执行过后ClientAddr的IP改为客户端的IP
第二次继续到这里后,执行这句就到下一句,ClientAddr的 IP仍然是204 204 没动,&AddrLen也没有从48变为16
因为ClientSocket[1]是怪数字,所以就退出了 ,我因为一直试不出就给他们都设数组互不干涉重新来一遍,所有的都是 数组,除了Port外其他都不相同,但是情况依旧如此。
还有 就是 客户端给服务器发送信息成功,但是有一句
recvp=recv(ClientSocket,sbuf,sizeof(sbuf),0);
运行到这里就退掉。源代码在后面 
我做打牌,不用线程光等也可以。
void host()
{
WSADATA wsData;
SOCKADDR_IN ServerAddr,ClientAddr;
SOCKET ClientSocket,ListenSocket;
short spieler=1;
WSAStartup(0x0202,&wsData);
//build up sockets;
ListenSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (ListenSocket==INVALID_SOCKET)
{
WSACleanup();
return;
}
//bind to specified port
memset(&ServerAddr,0,sizeof(ServerAddr));
ServerAddr.sin_family=AF_INET;
ServerAddr.sin_port=htons(9000);
//ServerAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
ServerAddr.sin_addr.s_addr=inet_addr(getip());
bind(ListenSocket,(SOCKADDR*)&ServerAddr,sizeof(ServerAddr));
//listen
listen(ListenSocket,4);
// receive connection
int AddrLen=sizeof(ClientAddr);
ClientSocket=accept(ListenSocket,(SOCKADDR*)&ClientAddr,&AddrLen);
if (ClientSocket==INVALID_SOCKET)
{
closesocket(ListenSocket);
WSACleanup();
return;
}
// begin sending and receiving data
char Buffer;
char sbuf[1];
int nBytes; while (true)
//while (0<(nBytes=recv(ClientSocket,Buffer,sizeof(Buffer),0))) {
nBytes=recv(ClientSocket,sbuf,sizeof(sbuf),0);
if (!nBytes) continue;
//Buffer[nBytes]=0;
//befehl=getbefehl(Buffer);
if (sbuf[0]=='l') 
{
sbuf[0]='a';
send(ListenSocket,sbuf,1,0);
spieler++; }
//if (Buffer[0]=='~') break;
//send(ClientSocket,Buffer,nBytes,0);
}
//close sockets
//shutdown(ClientSocket,SD_SEND);
//closesocket(ListenSocket);
//closesocket(ClientSocket);
//WSACleanup();
}
char pingip[15];
short ipad=0;short pstat=1;
void pingto(char *pingip)
{
WSADATA wsData;
SOCKADDR_IN ServerAddr;
SOCKET ClientSocket;
WSAStartup(0x0202,&wsData); //create socket
ClientSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (ClientSocket==INVALID_SOCKET)
{
WSACleanup();
return;
}
//connect to server port memset(&ServerAddr,0,sizeof(ServerAddr));
ServerAddr.sin_family=AF_INET;
ServerAddr.sin_port=htons(9000);
ServerAddr.sin_addr.s_addr=inet_addr(pingip);
//connect to server
connect(ClientSocket,(SOCKADDR*)&ServerAddr,sizeof(ServerAddr));
//send and receive data
char Buffer;
char sbuf[1];
int recvp;
for (;;)
{
if(pstat>10)
{
//send(ClientSocket,"l",1,0);
}
else switch (pstat)
{
case 1:
send(ClientSocket,"l",1,0);

break;
}
//if (0>=recv(ClientSocket,Buffer,sizeof(Buffer),0))
recvp=recv(ClientSocket,sbuf,sizeof(sbuf),0);
if (0<=recvp)
{
//break;
if (sbuf[0]=='a')
pstat=2;
}
else
{
//befehl=getbefehl(Buffer);
//printf("[receive from server]:  %s\n",Buffer);
}
}
//close socket
//shutdown(ClientSocket,SD_SEND);
//closesocket(ClientSocket);
//WSACleanup();
}

解决方案 »

  1.   

    ClientSocket=accept(ListenSocket,(SOCKADDR*)&ClientAddr,&AddrLen); 
    服务器也 参与玩的,这句是服务器上的,执行到此后就不动了 要 别人connect才能继续. 
    新建的套接字默认是阻塞套接字,所以你这里accept的时候当然会阻塞等待连接了。
    The accept function can block the caller until a connection is present if no pending connections are present on the queue, and the socket is ed as blocking. If the socket is ed as nonblocking and no pending connections are present on the queue, accept returns an error as described in the following.
      

  2.   

    第二次继续到这里后,执行这句就到下一句,ClientAddr的 IP仍然是204 204 没动,&AddrLen也没有从48变为16 这是accept调用失败了吧,看ClientSocket返回的是否有效socket,用WSAGetLastError获取一下错误代码。看是什么错误导致的。