小弟新手,初学socket编程,这是我做的第一个socket程序,出现一点小问题,自己也找不出来,希望大虾们不吝赐教,谢谢。问题是服务器启动之后,客户端始终提示连接不上,
我创建的是个单文档程序,在创建工程的时候从向导中添加了winsocket了。服务器端主要代码这样编写的。int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
//自动生成的代码
         //………… //创建套接字,之前已经定义了一个全局的sockSrv
sockSrv=socket(AF_INET,SOCK_STREAM,0);
if(INVALID_SOCKET==sockSrv)
{
MessageBox("套接字创建失败!");
return FALSE;
} //绑定套接字
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
   addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(8805); if(SOCKET_ERROR==sockSrv)
{
closesocket(sockSrv);
AfxMessageBox("绑定失败!");
return FALSE;
}
else
AfxMessageBox("绑定成功!");

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //监听
if (SOCKET_ERROR ==listen(sockSrv,5))
{
AfxMessageBox("监听失败");
}
else
AfxMessageBox("监听成功");
//创建新线程
LISTENPARAM *plistenParam=new LISTENPARAM;  //LISTENPARAM 是自定义的结构体,用来向线程函数传入之前创建的套接字
plistenParam->sock=sockSrv;
plistenParam->hwnd=m_hWnd;
HANDLE hThread=CreateThread(NULL,0,ListenProc,(LPVOID)plistenParam,0,NULL);   
CloseHandle(hThread); return 0;
}线程函数如下:
DWORD WINAPI CMainFrame::ListenProc(LPVOID lpParameter)
{
SOCKET sock=((LISTENPARAM*)lpParameter)->sock;  //将oncreat函数中的socket传入
HWND hwnd=((LISTENPARAM*)lpParameter)->hwnd;
delete lpParameter;
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);

while(1)   //接收循环
{
SOCKET sockConn=accept(sock,(SOCKADDR*)&addrClient,&len);
char sendBuf[100];
sprintf(sendBuf,"Welcome %s",
inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(sockConn,recvBuf,100,0); AfxMessageBox(sendBuf);

closesocket(sockConn);
}
}
客户端主要代码如下:void CMainFrame::OnConnect() 
{
char ip[20];
bool con=false; for (int i=0;i<256;i++)      //自动搜索主机地址,对每一个IP都连接一次,服务器的IP是192.168.1.101
{
sprintf(ip,"192.168.1.%d",i);
addrSrv.sin_addr.S_un.S_addr=inet_addr(ip);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(8805);
if (connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))==0)  //连接成功
{
MessageBox("连接成功");
con=true;
}
}

if (FALSE==con)
{
MessageBox("连接不成功");
}
}

解决方案 »

  1.   

    通过WSAGetLastError取得错误码看看怎么出错的!
      

  2.   

    通过WSAGetLastError取得错误码看看怎么出错的!
      

  3.   

    初始化socket没?
    wVersionRequested = MAKEWORD( 2, 1 );
    err = WSAStartup( wVersionRequested, &wsaData );
      

  4.   

    DWORD ws;
    WSAStartup( 0x0202, &ws);
      

  5.   

    非阻塞,connect要成功或失败才能返回,每1个失败的请求都要很长时间(5-10秒的情况也不是没有)才能返回
    你请求了256个IP,如果第101个IP才有效的话,前100个会提示失败,并且要很长时间
      

  6.   

    阻塞模式下,connect要成功或失败才能返回,每1个失败的请求都要很长时间(5-10秒的情况也不是没有)才能返回 
    你请求了256个IP,如果第101个IP才有效的话,前100个会提示失败,并且要很长时间非阻塞模式不管成功与否,立即返回,无等待时间
      

  7.   

    直接连服务器ip试试,sockclient没初始错吧