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

danielxuao 2004-06-15 07:59:56
用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来完成绑定端口的工作的。
------------------------------------------------------------

我也不是很了解其中的原因,有人能给我说说吗?多谢!
...全文
499 16 打赏 收藏 举报
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
csyw 2004-06-23
up
  • 打赏
  • 举报
回复
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);

还缺少了什么呢?
  • 打赏
  • 举报
回复
nbk16 2004-06-17
同上
  • 打赏
  • 举报
回复
54783szg 2004-06-16
有EMAIL吗?我有这方面的例子可以给你参考一下!
  • 打赏
  • 举报
回复
自由的风 2004-06-16
不知道楼主想说什么
  • 打赏
  • 举报
回复
nkwesley 2004-06-16
如果用无连接套接字的话
server流程
socket()->bind()->recvfrom()->sendto()->close()
client流程
socket()->bind()->sendto()->recvfrom()->close()
  • 打赏
  • 举报
回复
yanedanny 2004-06-16
server端还要增加一个CSocket变量,通过accept函数赋值,用以连接成功后与client建立数据通道。
  • 打赏
  • 举报
回复
顾君彦 2004-06-16
服务器端bind后,accept方法会进行等待客户接入,只要有客户接入,则会生成一个csocket实例,这就是当前那个客户连接后互相通信的基础。用它就可以给客户发数据。

客户端不需在绑定,作为发起连接端来讲,一般无需设定发送端口,直接connect到服务器的指定端口就行。
连接成功后,使用流或send就可以进行发数据了。
  • 打赏
  • 举报
回复
zwert 2004-06-16
如果用的是tcp别忘了accept。
  • 打赏
  • 举报
回复
sharkhuang 2004-06-16
send sendto
  • 打赏
  • 举报
回复
danielxuao 2004-06-16
有EMAIL吗?我有这方面的例子可以给你参考一下
http://community.csdn.net/Expert/topic/3095/3095226.xml?temp=.7846796
我需要你的例子,多谢
danielxu22@msn.com
  • 打赏
  • 举报
回复
yhqs540 2004-06-16
服务器使用accept得到了客户端的socket连接。你再向这个连接的输出流写数据
  • 打赏
  • 举报
回复
bloodna 2004-06-16
54783szg(浪淘沙) 我也很关注这方面的东东,能给我email吗?(bloodna@2911.net)谢谢
  • 打赏
  • 举报
回复
sailor_2002 2004-06-15
其实如果客户端连接成功,就建立了一个成功的TCP/IP连接,这时候就无论是服务器端还是客户端都可以调用send向对方放送信息,这时不需要其它设定,bind应该是服务器端在listen之前做的事,连接建立同时也说明bind成功
  • 打赏
  • 举报
回复
danielxuao 2004-06-15
xianfeihong(飞人):我用的是TCP方式,SOCK_STREAM,对于您的解释我不是很明白,如何在Client端主动发起连接呢?连接成功以后,在Client端调用Send就可以了吗?还需要其他的一些设定吗?和bind有关系吗?
  • 打赏
  • 举报
回复
xianfeihong 2004-06-15
在TCP/IP连接方式下,server端只有在客户端主动发起连接后,才能通过Socket
调用Send方法发送数据到Client端。
如果是UDP方式,则没有那方是server 或client, 什么时候都可以发。
就象QQ一样。
  • 打赏
  • 举报
回复
发帖
网络编程

1.8w+

社区成员

VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
帖子事件
创建了帖子
2004-06-15 07:59
社区公告
暂无公告