客户端能发消息给服务器,但服务器不能发给客户端

zhanlonglong 2011-06-30 10:59:08

void CTCPDlg::OnBnClickedOk() //发送
{
if (m_clientSocket.m_bConnected)//客户端
{
m_clientSocket.m_nLength=MsgEdit.GetWindowText
(m_clientSocket.m_szBuffer, sizeof(m_clientSocket.m_szBuffer));
m_clientSocket.AsyncSelect(FD_WRITE);
MsgEdit.SetWindowText("");
}
else if(m_srvrSocket.m_bConnected)//服务器
{
m_srvrSocket.m_nLength=MsgEdit.GetWindowText
(m_srvrSocket.m_szBuffer, sizeof(m_srvrSocket.m_szBuffer));
/*int ret = m_srvrSocket.Send(m_srvrSocket.m_szBuffer, m_srvrSocket.m_nLength);
if(ret == SOCKET_ERROR)
if(GetLastError()==WSAEWOULDBLOCK)
AfxMessageBox("The socket is marked as nonblocking and the requested operation would block");
else if(GetLastError()==WSAEINVAL)
AfxMessageBox("The socket has not been bound with Bind");
else if(GetLastError()==WSAESHUTDOWN)
AfxMessageBox("The socket has been shut down");
else if(GetLastError()==WSAENOTCONN)
AfxMessageBox("The socket is not connected");*/
m_srvrSocket.AsyncSelect(FD_WRITE);
MsgEdit.SetWindowText("");
}
else
AfxMessageBox("Not Connected!");

}
void MySock::OnSend(int nErrorCode)
{
Send(m_szBuffer,m_nLength,0);
m_nLength=0;
memset(m_szBuffer,0,sizeof(m_szBuffer));
//继续提请一个“读”的网络事件,接收Server消息
AsyncSelect(FD_READ);
CAsyncSocket::OnSend(nErrorCode);
}

看了两天,不知道哪里出错,单步调试发现,服务器端根本没有触发OnSend,而客户端正常。
如果加上上面的注释部分,服务器发送会提示"The socket is not connected"。
还请各位大侠救命!
...全文
159 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhanlonglong 2011-06-30
  • 打赏
  • 举报
回复
客户端和服务器的端口号应该一样还是不一样?
zhanlonglong 2011-06-30
  • 打赏
  • 举报
回复
回4楼:
我上面说过了,错误码是WSAENOTCONN,"The socket is not connected“。
hahayezhe112 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhanlonglong 的回复:]
回3楼:
我用的是MFC的CAsyncSocket类,你写的都用不到。。。
[/Quote]

既然是这个类 那么就在错误的函数调用处 判断下错误码是多少!
对照错误码MSDN的
zhanlonglong 2011-06-30
  • 打赏
  • 举报
回复
回3楼:
我用的是MFC的CAsyncSocket类,你写的都用不到。。。
zhanlonglong 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shenyi0106 的回复:]

FD_SEND不是你手动触发滴,它是根据send函数来自动决定的,当有发送缓冲区时,自动触发FD_SEND消息,
也就是说,你可以先不要关心有没有FD_SEND,直接send,然后再FD_SEND中处理善后工作
[/Quote]
那为什么客户端那样写就是正确的?
liye378 2011-06-30
  • 打赏
  • 举报
回复
#include <Winsock.h>
#include <windows.h>
#include <stdio.h>
#pragma comment(lib,"wsock32.lib")

#define PORT 2000

SOCKET sock,sock1; // 1.建立一个监听端口 2.收到一个请求端口
sockaddr_in ServerAddr;
char buff[80];

DWORD WINAPI RECVWorkerThread(LPVOID pParam);
DWORD WINAPI SENDWorkerThread(LPVOID pParam);


int main()
{

DWORD dwREVEThreadId,dwSENDThreadId;

WSADATA WSAData;
WSAStartup(MAKEWORD(2,2),&WSAData);

ServerAddr.sin_family=AF_INET;
ServerAddr.sin_addr.s_addr=htonl(INADDR_ANY);
ServerAddr.sin_port=htons(PORT);

sock=socket(AF_INET,SOCK_STREAM,0);
bind(sock,(struct sockaddr FAR *)&ServerAddr,sizeof(ServerAddr));

int Addrlen;
Addrlen=sizeof(sockaddr_in);
listen(sock,5);
printf("I am server...\nlistening...\n");

HANDLE RECVThreadHandle = CreateThread(NULL, 0, RECVWorkerThread, NULL, 0, &dwREVEThreadId);
HANDLE SENDThreadHandle = CreateThread(NULL, 0, SENDWorkerThread, NULL, 0, &dwSENDThreadId);

WaitForSingleObject(SENDThreadHandle, INFINITE);
CloseHandle (SENDThreadHandle);
WaitForSingleObject(RECVThreadHandle, INFINITE);
CloseHandle (RECVThreadHandle);

return 0;
}


DWORD WINAPI RECVWorkerThread(LPVOID lpParam)
{
int Addrlen=sizeof(sockaddr_in);
for (;;)
{
sock1=accept(sock,(struct sockaddr FAR *)&ServerAddr,&Addrlen);
for (;;)
{
memset(buff,0,80);
if (recv(sock1,buff,80,0)<=0)
{
break;
}
printf(buff);
printf("\n");
}
}
}


DWORD WINAPI SENDWorkerThread(LPVOID lpParam)
{
for (;;)
{
printf("please input your message:(0----exit.)\n");
memset(buff,0,80);
gets(buff);
send(sock1,buff,strlen(buff),0);
}
return 0;
}



这个是我自己写的简单socket双向通信的server端~~client端 参照吧 一样的
shenyi0106 2011-06-30
  • 打赏
  • 举报
回复
FD_SEND不是你手动触发滴,它是根据send函数来自动决定的,当有发送缓冲区时,自动触发FD_SEND消息,
也就是说,你可以先不要关心有没有FD_SEND,直接send,然后再FD_SEND中处理善后工作
zhanlonglong 2011-06-30
  • 打赏
  • 举报
回复
终于把程序搞通了,这个问题问得不对,谢谢各位了,给分。
superhanxin5 2011-06-30
  • 打赏
  • 举报
回复
服务器的端口是你服务端的程序定的,客户端的端口,是你建立连接的时候操作系统给你自动分配的
[Quote=引用 7 楼 zhanlonglong 的回复:]

客户端和服务器的端口号应该一样还是不一样?
[/Quote]

18,356

社区成员

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

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