WSAStartup问题,拜等大虾

whodewho 2009-09-08 10:33:09
现今在编写一个基于C/S多线程模式的网络软件。VS2008开发。有个问题想向ladies and gentlemen请教:C/S模式可以在同一台机器上运行吗?server的listen成功,client的connect总是失败,返回SOCKET_ERROR 10061: error = "Connection refused Tracker否决连接";以及 10093: error = "Successful WSASTARTUP not yet performed";
若是SOCKEt版本协商的问题,可能是哪样的问题?2.1跟2.2都试过,都无法连接。
...全文
425 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lint2008 2009-09-10
  • 打赏
  • 举报
回复
你好好看一下,你的服务器端没有调用 wsastartup()
lint2008 2009-09-10
  • 打赏
  • 举报
回复
Either the application hasn't called WSAStartup or WSAStartup failed. The application may be accessing a socket that the current active task does not own (that is, trying to share a socket between tasks), or WSACleanup has been called too many times.
zhaohongbo83 2009-09-10
  • 打赏
  • 举报
回复
cmd 下 net helpmsg 错误号
查看一下错误信息,
10061 是你的服务端拒绝,无法连接

应该是你的的服务端程序没有启起来吧
10093 服务端没有调用WSAStartup



whodewho 2009-09-10
  • 打赏
  • 举报
回复
s=recv(dlg->clisock,buff,100,10);
今天仔细调试了一下,问题已经解决,谢谢大家的关注
服务器端得wsastartup没有问题
whodewho 2009-09-09
  • 打赏
  • 举报
回复
下面是服务器端部分代码
BOOL COCSDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// 将“关于...”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO: 在此添加额外的初始化代码
//通过本机主机名.
char host_name[256];
gethostname(host_name,sizeof(host_name));
struct hostent *hp;
struct in_addr sa;
char *buf;
hp = gethostbyname(host_name);
if (hp != NULL)
{
//循环获取本地主机名
for (int i = 0; hp->h_addr_list[i]&&i<1; i++)
{
memcpy (&sa, hp->h_addr_list[i],hp->h_length);
//buf = inet_ntoa(sa);
//CString str;
//str=buf;
//COCSDlg *dlg=(COCSDlg*)AfxGetApp()->GetMainWnd();
//dlg->MessageBox(str);
m_Ip.SetAddress(htonl(sa.S_un.S_addr) );
}
}

serv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
serv.sin_family=AF_INET;
serv.sin_port=6000;
sersock=socket(AF_INET,SOCK_STREAM,0);
addlen=sizeof(serv);
if(bind(sersock,(sockaddr*)&serv,addlen))
{
MessageBox(_T("绑定失败"));
return false;
}
else
{
MessageBox(_T("服务器创建成功"));
listen(sersock,5);
AfxBeginThread(thread,0);
}
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}


UINT COCSDlg::thread(LPVOID p)
{
char mix[100];
int s=1,n,loop=1;
COCSDlg *dlg=(COCSDlg*)AfxGetApp()->GetMainWnd();
n=dlg->getcount();
if(n=-1)
loop=0;
if(loop)
{
s=1;
//使用空缺的socket等待客户连接
dlg->csocks[n]=accept(dlg->sersock,(sockaddr*)&(dlg->serv),&(dlg->addlen));
if(dlg->csocks[n]==INVALID_SOCKET)
{
//如果返回错误,则提示错误
dlg->MessageBox(_T("接收失败"));
}
else
{
AfxBeginThread(thread,0);
//如果没有发生错误,则一直循环等待数据的到来
while(s!=SOCKET_ERROR)
{
s=recv(dlg->csocks[n],dlg->buff[n],100,0);
if(s!=SOCKET_ERROR)
{
//深加工于此
/* for(int i=1;i<5;i++)
{
strcat_s(mix,dlg->buff[i]);
}*/
char max[100]="dsfs";

send(dlg->csocks[n],max,100,0);
}
}
//如果发生错误,发送连接中断消息到客户端、
send(dlg->csocks[n],"Disconnected",100,0);
dlg->csocks[n]=NULL;
closesocket(dlg->csocks[n]);
}
}
AfxEndThread(0);
return 0;
}
whodewho 2009-09-09
  • 打赏
  • 举报
回复
代码在这里
BOOL COCCApp::InitInstance()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
//COCCDlg *dlg=(COCCDlg*)AfxGetApp()->GetMainWnd();
//dlg->MessageBox(_T("Failed"));
return 1;
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2) {
WSACleanup( );
return 1;
}

// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);

CWinApp::InitInstance();

AfxEnableControlContainer();

// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));

COCCDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用
// “确定”来关闭对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用
// “取消”来关闭对话框的代码
}

// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
}



void COCCDlg::OnBnClickedBtnCon()
{
// TODO: 在此添加控件通知处理程序代码
DWORD dwIP1;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP1);
cli.sin_addr.S_un.S_addr=htonl(dwIP1);
cli.sin_family=AF_INET;
cli.sin_port=6000;
clisock=socket(AF_INET,SOCK_STREAM,0);
AfxBeginThread(thread,0);
}

UINT COCCDlg::thread(LPVOID v)
{
int s=1;
char buff[100];
CString str;
COCCDlg *dlg=(COCCDlg*)AfxGetApp()->GetMainWnd();
if(SOCKET_ERROR==connect(dlg->clisock,(sockaddr*)&(dlg->cli),sizeof(dlg->cli)))
{
DWORD err=GetLastError();
CString strx;
strx.Format(_T("%d"),err);
//dlg->MessageBox(strx);
//dlg->MessageBox(_T("连接失败"));
//dlg->SetDlgItemTextW(IDC_EDIT,_T("Failed"));
dlg->SetDlgItemTextW(IDC_EDIT,strx);
WSACleanup();
return 0;
}
while(s!=SOCKET_ERROR)
{
s=recv(dlg->clisock,buff,100,10);
if(s==SOCKET_ERROR)
{
char buff2[100];
_itoa_s(GetLastError(),buff2,15);
CString str1;
str1=buff2;
dlg->MessageBox(str);
return 0;
}
CString str;
//str.Format(_T("%s"), buff);
str=buff;
dlg->MessageBox(str);
//接收到混合数组与此
//
}
send(dlg->clisock,"Disconnected",100,0);
closesocket(dlg->clisock);
AfxEndThread(0);
return 0;
}
whodewho 2009-09-09
  • 打赏
  • 举报
回复
6楼说的对
7楼的担心不存在
问题是:还连不上啊!!!
xylicon 2009-09-09
  • 打赏
  • 举报
回复
cli.sin_port=6000;

[Quote=引用 6 楼 conry 的回复:]
cli.sin_port=htons(6000);

[/Quote]

真细心。


lijianli9 2009-09-09
  • 打赏
  • 举报
回复
服务端没有调用WSAStartup吧?
Conry 2009-09-09
  • 打赏
  • 举报
回复
cli.sin_port=htons(6000);
whodewho 2009-09-09
  • 打赏
  • 举报
回复
自己抬一下。。。
kecoi 2009-09-08
  • 打赏
  • 举报
回复
这要具体代码才好分析
  • 打赏
  • 举报
回复
发送具体代码


不是版本问题 应该是你的代码有待解决

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧