bind() 失败: 应用程序没有调用 WSAStartup

来源:互联网 发布:java中对象的定义 编辑:程序博客网 时间:2024/05/10 21:14

Bind()的时候出错啦!

#include "StdAfx.h"
#include "MediaPlayer.h"
#include "Server.h"
#include "MediaPlayerDlg.h"

CServer::CServer()
{
 m_hSocket=NULL;
}


CServer::~CServer()
{
 WSAAsyncSelect(m_hSocket, m_hWnd, 0, 0);
}

void CServer::ServerInit()
{
 if(WSAAsyncSelect(m_hSocket, m_hWnd, SER_MESSAGE, FD_ACCEPT|FD_READ|FD_WRITE|FD_CLOSE)>0)
  AfxMessageBox(L"error select");
}

BOOL CServer::InitAndListen(HWND hwnd,UINT port)
{
 m_uPort=port;
 m_hWnd=hwnd;

 if(m_hSocket != NULL)
 {
  //如果已经创建了套接字先关闭原来的
  closesocket(m_hSocket);
  m_hSocket = NULL;
 }
 if(m_hSocket == NULL)
 {
  //创建新的套接字,这里是创建的流类型的套接字
  m_hSocket = socket(AF_INET, SOCK_STREAM,0);
  ASSERT(m_hSocket != NULL);
  ServerInit();
 }
 m_addr.sin_family = AF_INET;
 m_addr.sin_addr.S_un.S_addr = INADDR_ANY;
 m_addr.sin_port = htons(m_uPort);

 int ret = 0;
 int error = 0;
 //绑定一个套接字到本机的地址
 ret = bind(m_hSocket, (LPSOCKADDR)&m_addr, sizeof(m_addr));

 if(ret == SOCKET_ERROR)
 { //绑定错误
  AfxMessageBox(L"Binding Error");
  return FALSE;
 }

 //开始一个侦听过程,等待客户的连接
 ret = listen(m_hSocket, 5);    //这里的第二个参数表示最多支持的客户连接数
 if(ret == SOCKET_ERROR)
 { //listen失败
  AfxMessageBox(L"Listen Error");
  return FALSE;
 }

 return TRUE;
}

解决方案:

bind 失败: 应用程序没有调用 WSAStartup
需加上:
  WSADATA WSAData;
  WSAStartup(MAKEWORD( 2, 2 ), &WSAData);

原创粉丝点击