服务器不能bind

qazwsx123asdfadf 2010-10-08 05:06:39
我想模拟一个很简单的聊天工具,但是服务器bind总返回1,WSAGetLastError()=0,我也查不到代表什么。
刚看这方面的书,请高手们帮帮忙啊!还有就是,服务器和客户端能不能写到一个程序里面?


服务器

ServerDlg.h

protected:
HICON m_hIcon;

// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()


SOCKET servSock;
SOCKADDR_IN servAddr,clientAddr;
public:
CEdit m_Dlg;
CEdit m_Send;
afx_msg void OnTimer(UINT_PTR nIDEvent);
CButton m_OK;


ServerDlg.cpp


BOOL CServerDlg::OnInitDialog()
{
CDialog::OnInitDialog();

...............

// TODO: 在此添加额外的初始化代码
servSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (servSock==INVALID_SOCKET)
{
AfxMessageBox(_T("服务器套接字创建失败!"));
return FALSE;
}
//////////////////////////////////////////////////////////////////////////
servAddr.sin_family=PF_INET;
servAddr.sin_port=htons(5000);
servAddr.sin_addr.s_addr=inet_addr("59.66.134.170");
SetTimer(1,1,NULL);

return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CServerDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

//////////////////////////////////////////////////////////////////////////

//if(Flag==1)return;
u_long u=1;
if (int n=bind(servSock,(LPSOCKADDR)&servAddr,sizeof(servAddr))==SOCKET_ERROR)
{
m_Dlg.SetWindowText(_T("服务器绑定失败!"));
int c=WSAGetLastError();
// closesocket(servSock);
return ;//FALSE;
}
else
{
Flag++;
ioctlsocket(servSock,FIONBIO,(unsigned long*)&u);
int len;
len=sizeof(clientAddr);
listen(servSock,30);
SOCKET newSock;
newSock=accept(servSock,(sockaddr FAR*)&clientAddr,&len);
if (newSock==INVALID_SOCKET)
{
m_Dlg.SetWindowText(_T("服务器接受失败!"));
// closesocket(servSock);
return ;//FALSE;
}
else
{
m_Send.SetWindowText(_T("服务器接收成功"));
char ch[20]={0},c[]={"sdf"};
int n=send(newSock,c,sizeof(c),0);
if(n==sizeof(c))AfxMessageBox(_T("发送成功"));
int r=recv(newSock,ch,20,0);
if(r<0)
{
int d=WSAGetLastError();
// closesocket(servSock);
AfxMessageBox(_T("接收失败!"));
return ;//FALSE;
}
else if(r==0)AfxMessageBox(_T("传送完毕!"));
else
{
CString str;
str.Format(_T("%s"),ch);
m_Send.SetWindowText(str);
}
}
}

CDialog::OnTimer(nIDEvent);
}


客户端

clientDlg.cpp

BOOL CClientDlg::OnInitDialog()
{
CDialog::OnInitDialog();

.............

// TODO: 在此添加额外的初始化代码


clientSock=socket(AF_INET,SOCK_STREAM,0);
if (clientSock==INVALID_SOCKET)
{
AfxMessageBox(_T("客户端套接字创建失败!"));
return FALSE;
}
//////////////////////////////////////////////////////////////////////////
clientAddr.sin_family=AF_INET;
clientAddr.sin_port=htons(5000);
clientAddr.sin_addr.s_addr=inet_addr("59.66.134.170");
//////////////////////////////////////////////////////////////////////////
if(connect(clientSock,(LPSOCKADDR)&clientAddr,sizeof(clientAddr))==SOCKET_ERROR)
{
int t=WSAGetLastError();
closesocket(clientSock);
m_Dlg.SetWindowText(_T("客户端连接失败"));
return FALSE;
}
else m_Dlg.SetWindowText(_T("连接成功"));
char ch[]={"sdf"};
int n=send(clientSock,ch,sizeof(ch),0);
if(n==SOCKET_ERROR)
m_Dlg.SetWindowText(_T("发送失败"));
if(n==sizeof(ch)) m_Dlg.SetWindowText(_T("发送成功"));
int c=WSAGetLastError();
//////////////////////////////////////////////////////////////////////////
u_long u=1;
ioctlsocket(clientSock,FIONBIO,(unsigned long*)&u);
SetTimer(1,1,NULL);


return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CClientDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (clientSock!=INVALID_SOCKET)
{
char rec[100]={0};
if (recv(clientSock,rec,1024,0)<=0)
{
m_Send.SetWindowText(_T("客户端接收失败"));
// closesocket(clientSock);
return;
}
CString str;
str.Format(_T("%s"),rec);
m_Dlg.SetWindowText(str);
}

CDialog::OnTimer(nIDEvent);
}
...全文
156 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qazwsx123asdfadf 2010-10-09
  • 打赏
  • 举报
回复
谢谢各位啊,现在没问题了^_^
djh512 2010-10-08
  • 打赏
  • 举报
回复

BOOL CTabADlg::InitSocket()
{
m_ServerSock = socket(AF_INET,SOCK_STREAM,0); //初始化服务器SOCKET

// 服务器的服务设置
m_ServerAddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
m_ServerAddr.sin_family=AF_INET;
m_ServerAddr.sin_port=htons(8001);

bind(m_ServerSock,(SOCKADDR*)&m_ServerAddr,sizeof(SOCKADDR)); //socket绑定端口

listen(m_ServerSock,10); //socket端口进入监听模式

RECVPARAM *pRecvParam = new RECVPARAM;
pRecvParam->sock = m_ServerSock;
pRecvParam->hwnd = m_hWnd;

HANDLE hThread = CreateThread(NULL,0,ThreadProc,(LPVOID)pRecvParam,0,NULL);
CloseHandle(hThread);

return TRUE;
}

在线程函数里面处理消息
djh512 2010-10-08
  • 打赏
  • 举报
回复
运用多线程 服务器和客户端可以放在一个程序里面
我前些天刚好写了一个聊天程序
不过也写的很垃圾
qazwsx123asdfadf 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fanghaze 的回复:]

服务器和客户端能不能写在一个程序里?
能!!
[/Quote]
怎么写啊,能给一段代码吗?
科技完美生活 2010-10-08
  • 打赏
  • 举报
回复
服务器和客户端能不能写在一个程序里?
能!!
qazwsx123asdfadf 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wwkevin811 的回复:]
一个程序如果只有一个线程,自然不能放一个程序里,如果你多线程的程序,我认为是可以地一个线程监听另一个线程的请求,不过这样的程序很不健康。还有你的问题有歧义,有的程序……
[/Quote]
现在我把bind放到了上面,timer函数改为如下:

u_long u=1;

ioctlsocket(servSock,FIONBIO,(unsigned long*)&u);
int len;
len=sizeof(clientAddr);
SOCKET newSock;
now=accept(servSock,(sockaddr FAR*)&clientAddr,&len);
if (now==INVALID_SOCKET)
{
m_Online.SetWindowText(_T("!!!"));
// closesocket(servSock);
return ;//FALSE;
}
else
{
m_Online.SetWindowText(_T("在线"));
、、 char ch[20]={0},c[]={"sdf"};
// int n=send(now,c,sizeof(c),0);
// if(n==sizeof(c))m_Send.SetWindowText(_T("发送成功"));
int r=recv(now,ch,1024,0);
if(r<0)
{
int d;
d=WSAGetLastError();
// closesocket(servSock);
// AfxMessageBox(_T("接收失败!"));
return ;//FALSE;
}
else if(r==0)m_Send.SetWindowText(_T("传送完毕!"));
else
{
CString str;
str.Format(_T("%s"),ch);
theword=theword+_T("\r\nYOU:")+str;
m_Dlg.SetWindowText(theword);
}
}

为什么debug的时候没有错误,而运行的时候始终accept不成功
wwkevin811 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qazwsx123asdfadf 的回复:]

引用 2 楼 ayw215 的回复:

为毛你的server要在timer里面bind?
一次bind就够了

服务器和客户端能不能写在一个程序里?
[/Quote]

一个程序如果只有一个线程,自然不能放一个程序里,如果你多线程的程序,我认为是可以地一个线程监听另一个线程的请求,不过这样的程序很不健康。还有你的问题有歧义,有的程序既是服务端也是客户端,接受到请求,然后发送请求到另一个服务器。
qazwsx123asdfadf 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gules 的回复:]

bind()只能调用一次;数据问题是因为字符编码的原因引起输出的问题。
[/Quote]
应该怎么解决啊?
qazwsx123asdfadf 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ayw215 的回复:]

为毛你的server要在timer里面bind?
一次bind就够了
[/Quote]
服务器和客户端能不能写在一个程序里?
gules 2010-10-08
  • 打赏
  • 举报
回复
bind()只能调用一次;数据问题是因为字符编码的原因引起输出的问题。
qazwsx123asdfadf 2010-10-08
  • 打赏
  • 举报
回复
我试了下,确实可以,不过为什么得到的数据是“摳f”而不是“sdf”啊?
ayw215 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qazwsx123asdfadf 的回复:]

引用 2 楼 ayw215 的回复:

为毛你的server要在timer里面bind?
一次bind就够了

不管几个客户端,只需要一次bind就可以吗?
[/Quote]
对的
qazwsx123asdfadf 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ayw215 的回复:]

为毛你的server要在timer里面bind?
一次bind就够了
[/Quote]
不管几个客户端,只需要一次bind就可以吗?
ayw215 2010-10-08
  • 打赏
  • 举报
回复
为毛你的server要在timer里面bind?
一次bind就够了
qazwsx123asdfadf 2010-10-08
  • 打赏
  • 举报
回复
服务器运行的时候,第一次可以bind,Timer下一次运行的时候就不行了。
客户端显示可以发送数据,但不可以接收,服务器都不行。
connect这几个函数不太明白怎么用啊。

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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