Server端如何通过Socket发送数据给Client

danielxuao 2004-06-15 05:01:32
用MFC在Server端程序:

Create(...);
Listen(...);
OnReceive(...);

在Client端程序:
Connect(pHostAddress, pHostPort);
CSocket::Send( pData, pLength);

Client可以发送数据给Server,但是我使用CSocket::Send( pData, pLength)从Server发送到Client,就没有接收到任何的数据,不知道这是为什么

或者我没有在Server端使用bind函数?

不过我在
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=194673
找到相应的bind问题:

CSocket server;
server.Create(9999,NULL,NULL);
也可以吧?

和下面写法有区别吗?
SOCKADDR_IN serverSockAddr;
serverSockAddr.sin_port=htons(9999);
serverSockAddr.sin_family=AF_INET;
serverSockAddr.sin_addr.s_addr=htonl(INADDR_ANY);

serverSocket=socket(AF_INET, SOCK_STREAM, 0);
bind(serverSocket, (LPSOCKADDR) &serverSockAddr, sizeof(serverSockAddr));

有人这样说道:
------------------------------------------------------------
是一样的。
serverSocket.Create(9999,NULL,NULL);这种方法用的是mfc,而bind(serverSocket, (LPSOCKADDR) &serverSockAddr, sizeof(serverSockAddr));这种方法用的是api。实际上第一种方法中mfc也是调用api函数bind来完成绑定端口的工作的。
------------------------------------------------------------

我也不是很了解其中的原因,有人能给我说说吗?多谢!
...全文
104 点赞 收藏 5
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
danielxuao 2004-06-22
我的代码是这样的:
////////////////////////////////////////////////////////////////////////////////
// Operations //
////////////////////////////////////////////////////////////////////////////////
void CDerivedSocket::Initialize(bool pIsServer, LPCTSTR pHostAddress, UINT pHostPort)
{
AfxSocketInit();
// Creating a stream socket.
// socket server
if( pIsServer) {
if( Create(pHostPort) == 0)
TRACE("Unable to create a socket. Error is %d", GetLastError());
}
else{ // socket client
if( Create() == 0)
TRACE("Unable to create a socket. Error is %d", GetLastError());
if( Connect(pHostAddress, pHostPort) == 0)
TRACE("Unable to connect to a socket. Error is %d", GetLastError());
}
}

// Overrided Notification Function
void CDerivedSocket::OnReceive(int nErrorCode)
{
CSocket::OnReceive(nErrorCode);
ASSERT( m_nDataSize != 0 );
char* buff = new char[m_nDataSize];
Receive(buff, m_nDataSize);
// Notify that the message is received.
::PostMessage( HWND_BROADCAST, m_nTransferMessage, (WPARAM)buff, m_nLParam);
}

// Overrided Notification Function
void CDerivedSocket::OnAccept(int nErrorCode)
{
CSocket::OnAccept(nErrorCode);
CDerivedSocket* This = new CDerivedSocket();
This->m_nDataSize = m_nDataSize;
This->m_nLParam = m_nLParam;
Accept(*This);
}

// Collect the RegisterWindow message Id, inorder to notify
void CDerivedSocket::Listen(UINT pOnReciveId, LPARAM pParam)
{
m_nLParam = pParam;
m_nTransferMessage = pOnReciveId;
CSocket::Listen();
}

bool CDerivedSocket::Send(char* pData, int pLength)
{
int bytesSent = 0;
bytesSent = CSocket::Send( pData, pLength);
if( bytesSent <= 0 ) {
TRACE("Unable to send data. Error is %d", GetLastError());
return false;
}
return true;
}

我从Client端发送数据给Server端是成功的,
但是从Server端发送数据给Client,发送端显示Okay,接收端没有数据进来,不知道为什么
我所调用的都是
Send( pData, pLength);
回复
月吻长河 2004-06-18
和Client发送到Server一样的啊!
回复
B2China 2004-06-18
楼主,贴出你客户端和服务器端发送、接收数据的代码吧。
回复
PiggyXP 2004-06-17
楼主的代码就说明了原因

Create是调用的CSocket类的一个方法,是MFC为我们封装好了的,使用起来非常简便,但是出了windows系统就不能用了

而bind那一串其实就等于是Create的具体实现,使用的“纯”socket 的api

不知道这个是不是楼主想要的答复^_^
回复
danielxuao 2004-06-15
up一下
回复
发动态
发帖子
网络编程
创建于2007-09-28

1.8w+

社区成员

VC/MFC 网络编程
申请成为版主
社区公告
暂无公告