关于socket数据接收发送的问题

Tody Guo 2008-08-23 11:07:15

关于这个问题自己也想了很多,现在的问题就是如果我要发送的字节数量超过了send或recv的BUF的大小时,我剩下的数据怎么让它继续的传输或接收到。
希望能得到大侠的指点。
谢谢先!
...全文
143 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
manio 2008-08-24
  • 打赏
  • 举报
回复
VC的一个SOCKET发送类

// MSocket.h: interface for the MSocket class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MSOCKET_H__173986E0_9B3F_45BC_BD5E_D2510290E3FA__INCLUDED_)
#define AFX_MSOCKET_H__173986E0_9B3F_45BC_BD5E_D2510290E3FA__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <windows.h>
#include <iostream.h>
#include <winsock.h>

#define NO_FLAGS_SET 0

///////////////////////////////////////////////
//MSocket is as a TCP client
//it connect to host to send and recv data
///////////////////////////////////////////////
class MSocket
{
public:
int recvData(char *mdata, int msize);
bool disconnectFromHost();
bool sendData(char *mdata, int msize);
bool connectToHost();
MSocket(char *destip, u_short destport);
virtual ~MSocket();

private:
char m_DestIp[32];
u_short m_DestPort;
WSADATA Data;
SOCKADDR_IN destSockAddr;
SOCKET destSocket;
unsigned long destAddr;
int status;
int numsnt;

};

#endif // !defined(AFX_MSOCKET_H__173986E0_9B3F_45BC_BD5E_D2510290E3FA__INCLUDED_)



// MSocket.cpp: implementation of the MSocket class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MSocket.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

MSocket::MSocket(char *destip, u_short destport)
{
strcpy(m_DestIp, destip);
m_DestPort = destport;

/* initialize the Windows Socket DLL */
status=WSAStartup(MAKEWORD(1, 1), &Data);
if (status != 0)
cerr << "ERROR: WSAStartup unsuccessful"
<< endl;

/* convert IP address into in_addr form */
destAddr=inet_addr(m_DestIp);
/* copy destAddr into sockaddr_in structure */
memcpy(&destSockAddr.sin_addr,
&destAddr, sizeof(destAddr));
/* specify the port portion of the address */
destSockAddr.sin_port=htons(m_DestPort);
/* specify the address family as Internet */
destSockAddr.sin_family=AF_INET;


}

MSocket::~MSocket()
{

}

bool MSocket::connectToHost()
{
/*掉线后要重新获取SOCKET,才能重连上,一次连接一个SOCKET*/
/* create a socket */
destSocket=socket(AF_INET, SOCK_STREAM, 0);
if (destSocket == INVALID_SOCKET)
{
cerr << "ERROR: socket unsuccessful" << endl;
status=WSACleanup();
if (status == SOCKET_ERROR)
cerr << "ERROR: WSACleanup unsuccessful"
<< endl;
return false;
}
cout<<"MSocket initialized sucessfully!"<<endl;
cout << "Trying to connect to IP Address: "
<< m_DestIp << endl;

/* connect to the server */
status=connect(destSocket, (LPSOCKADDR) &destSockAddr, sizeof(destSockAddr));
if (status == SOCKET_ERROR)
{
cerr << "ERROR: connect unsuccessful" << endl;
status=closesocket(destSocket);
if (status == SOCKET_ERROR)
cerr << "ERROR: closesocket unsuccessful"
<< endl;
return false ;
}
cout << "Connected..." << endl;
return true;
}

bool MSocket::sendData(char *mdata, int msize)
{
cout << "Sending..." << endl;
numsnt=send(destSocket, mdata, msize, NO_FLAGS_SET);
if (numsnt != msize)
{
cout << "Connection terminated" << endl;
status=closesocket(destSocket);
if (status == SOCKET_ERROR)
cerr << "ERROR: closesocket unsuccessful"
<< endl;
return false;
}
return true;
}

bool MSocket::disconnectFromHost()
{
status=closesocket(destSocket);
if (status == SOCKET_ERROR) {
cerr << "ERROR: closesocket unsuccessful"
<< endl;
}
status=WSACleanup();
if (status == SOCKET_ERROR) {
cerr << "ERROR: WSACleanup unsuccessful"
<< endl;
return false;
}
return true;
}

int MSocket::recvData(char *mdata, int msize)
{
status = recv(destSocket, mdata, msize, NO_FLAGS_SET);
if (status == SOCKET_ERROR) {
cerr << "ERROR: recv() unsuccessful" << endl;
}
return status;
}
iambic 2008-08-24
  • 打赏
  • 举报
回复
socket是流式的,一直发就是了。不会管你是分几次发的。
csgdseed 2008-08-24
  • 打赏
  • 举报
回复
发送时有限制的
chlaws 2008-08-24
  • 打赏
  • 举报
回复
分段发送咯
YFY 2008-08-24
  • 打赏
  • 举报
回复
发送时分包发送【可按1024字节】,接收时也是分包接收【可按1024字节】。
chenfeng2002 2008-08-23
  • 打赏
  • 举报
回复
可以自己为要传送的一份数据打个包,发送过程拆分包,接收过程重组包。
060 2008-08-23
  • 打赏
  • 举报
回复
将数据分成许多块, 每次send一块,

将recv放在while(1)里, 直到recv的返回值<=0

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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