帮我看看,客户端怎么连接不上服务器?
本帖最后由 oyljerry 于 2013-08-22 22:01:52 编辑 服务器代码:
#define PORT 9000
int static index = 0;
DWORD block = 1L;
WSADATA dat;
FD_SET ReadSet;
if(WSAStartup(MAKEWORD(2,2),&dat)!=0)
{
MessageBox(L"Init Windows Socket Failed",0,0);
}
//Socket返回值
int ret=0;
//创建Socket
serverSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
if (serverSocket==INVALID_SOCKET)
{
WSACleanup();
MessageBox(L"Create Socket Failed",0,0);
}
SOCKADDR_IN serverIP;
serverIP.sin_family=AF_INET;
serverIP.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
serverIP.sin_port=htons(PORT);
//memset(localAddr.sin_zero,0,sizeof(localAddr.sin_zero));
if (bind(serverSocket,(struct sockaddr*)&serverIP,sizeof(SOCKADDR))==SOCKET_ERROR)
{
MessageBox(L"Bind Error",0,0);
}
//服务器监听
if (listen(serverSocket,10)==SOCKET_ERROR)
{
MessageBox(L"Listen Failed",0,0);
}
if(ioctlsocket(serverSocket,FIONBIO,&block)==SOCKET_ERROR)
{
MessageBox(L"Set listen Unblock error");
}
//非阻塞模式接受客户端连接
while(TRUE)
{
//SET清0
FD_ZERO(&ReadSet);
//把客户端连接放入集合中
for(int i=0;i<index;i)
{
FD_SET(clientSocket[i],&ReadSet);
}
FD_SET(serverSocket,&ReadSet);
if(select(0,&ReadSet,NULL,NULL,NULL)==SOCKET_ERROR)
{
MessageBox(L"select listen socket error",0,0);
system("pause");
}
if(FD_ISSET(serverSocket,&ReadSet))
{
acceptSocket = accept(serverSocket,NULL,NULL);
if(acceptSocket!=INVALID_SOCKET)
{
clientSocket[index]=acceptSocket;
index++;
}
else
{
MessageBox(L"accept client error",0,0);
continue;
}
}
for (int j=0;j<index;j)
{
if(FD_ISSET(clientSocket[j],&ReadSet))
{
ofstream out("E://psb.jpg",fstream::out|fstream::binary);
char buf[100];
memset(buf,0,1024);
ret=recv(clientSocket[j],buf,1024,0);
if(ret!=SOCKET_ERROR)
{
out.write(buf,sizeof(char)*ret);
}
else
{
MessageBox(L"!!!",0,0);
clientSocket[j]=NULL;
index--;
closesocket(clientSocket[j]);
break;
}
}
}
}
客户端代码:
#define PORT 9000
if (WSAStartup(MAKEWORD(2,2),&dat)!=0)
{
MessageBox(L"Init Falied",0,0);
return -1;
}
int ret(0);
//创建Socket
clientSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
if(clientSocket==INVALID_SOCKET)
{
MessageBox(L"socket Falied",0,0);
return -1;
}
SOCKADDR_IN serverAddr;
serverAddr.sin_family=AF_INET;
serverAddr.sin_addr.s_addr=inet_addr(IP_ADDR);
serverAddr.sin_port=htons(PORT);
memset(serverAddr.sin_zero,0,sizeof(serverAddr.sin_zero));
ret=connect(clientSocket,(struct sockaddr*)&serverAddr,sizeof(serverAddr));
if(ret==SOCKET_ERROR)
{
MessageBox(L"Connect Falied:",0,0);
return -1;
}
ifstream in("F://psb.jpg",fstream::in|fstream::binary);
char buf[1024]={0};
while (!in.eof())
{
in.read(buf,sizeof(buf));
ret=send(clientSocket,buf,1024,0);
if(ret==SOCKET_ERROR)
{
MessageBox(L"Send Info error:",0,0);
}
}
in.close();
closesocket(clientSocket);
WSACleanup();
[解决办法]
if(ioctlsocket(serverSocket,FIONBIO,&block)==SOCKET_ERROR)
{
MessageBox(L"Set listen Unblock error");
}
服务端不用设置这个
[解决办法]
连上以后 本来刚连上那次循环就收不了数据的 要下一次循环才因为FD_SET(clientSocket[i],&ReadSet)了所以
数据来了FD_ISSET(clientSocket[j],&ReadSet)才能为真 而且你的删除是有问题的clientSocket[j]=NULL;
index--; 这里应该改成把最后一个移到j 然后删除最后一个再index-- 否则实际是j出错你把index-1这个
句柄删除了 而j这个位置为null 这样下次j和index-1都不会再收到数据了 你还是网上找一个可以的示例照着改吧
[解决办法]
是我看错了还是你压根写的就不对,你的循环怎么都没有++的?