Socket编程 TCP发送能不能循环调用send()方法

internet91 2012-12-12 09:45:51
我调用send()方法,循环调用20次,但服务器只收到一条。如果循环调用10次,则服务器还能收到8到9条,但也不全。请指教如何处理。谢谢!

//第2步:初始化套接口
SOCKET localSendSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( localSendSocket == INVALID_SOCKET ) {
printf("error at socket().\n");
return 1;
}


//第3步:绑定本地端口,不绑定也可以,端口会自动分配
sockaddr_in localaddr;
memset(&localaddr, 0, sizeof(localaddr));//全设置成0
localaddr.sin_family = AF_INET;
localaddr.sin_addr.s_addr = htonl(INADDR_ANY);
localaddr.sin_port = htons(5657);
int localaddrSize = sizeof(localaddr);
if(bind( localSendSocket, (sockaddr *)&localaddr, sizeof(struct sockaddr))!=0 ) {
printf("不能绑定端口!\n");//初始化失败返回-1
return -1;
}

//第4步:构造远程socket地址数据结构
sockaddr_in remoteaddr;
memset(&remoteaddr, 0, sizeof(remoteaddr));//全设置成0
remoteaddr.sin_family = AF_INET;
remoteaddr.sin_addr.s_addr = inet_addr( toHostIp );
remoteaddr.sin_port = htons( toHostPort );

if ( connect(localSendSocket, (SOCKADDR*)&remoteaddr, sizeof(struct sockaddr)) == SOCKET_ERROR ) {
AfxMessageBox("connect to server failed.");
}
//此处循环发送20次,但服务器只收到一条数据,不知道怎么处理。
for (int i=0; i<20; i++) {
char* buf = "this is data send to the server!\r\n";
int sendResult = send(localSendSocket, buf, (int)strlen(buf), 0 );
}

//第6步:关闭套接口
closesocket(localSendSocket);
...全文
847 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ctreewang 2012-12-13
  • 打赏
  • 举报
回复
貌似recv 是要循环不停的接受数据吧?
proorck6 2012-12-13
  • 打赏
  • 举报
回复
你没有处理sendResult的值,在某些情况下,例如数据包大于缓冲的长度,你需要编写一个MySend,在里边循环发送,保证能够把数据完整地发送出去。
internet91 2012-12-13
  • 打赏
  • 举报
回复
问题已解决,解决办法,在接收程序中添加循环接收。请参看红色部分。 原先的程序只有循环等待连接,也就是"while(true)"部分,而没有“while (n>0)”部分。 谢谢各位! //等待客户的连接请求 CString fileFullName = "UUTemp/1-test.dat"; while (true) { SOCKET clientSocket = accept(listenSocket, NULL, NULL); if (clientSocket == INVALID_SOCKET) { AfxMessageBox("错误:客户端无效!\n"); nSockErr = WSAGetLastError(); } else { //有客户链接请求被成功接收 char buf[2048]; //1024*10 memset(buf, 0, sizeof(char)*2048); //接收客户端传输过来的数据 int n = recv(clientSocket, buf, 2048, 0); //循环接收客户端的数据,客户端可能一次连接发送多次数据 while (n>0) { //接收到的文件写入 CString s; s.Format("服务器已经接收%d个字符:%s\n", n, buf); //AfxMessageBox(s); //把接收到的数据写入到文件中 CFile file; //先判断文件存在不存在,如果不存在,则创建 if( !file.Open(fileFullName, CFile::modeWrite|CFile::typeBinary) ) { //文件不存在 file.Open(fileFullName, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary); } else { //如果文件存在,移动到最后位置 file.SeekToEnd(); } //往文件中追加数据 file.Write(buf, n); //关闭文件 file.Close(); n = recv(clientSocket, buf, 2048, 0); } //delete []buf; } closesocket(clientSocket); }
大尾巴猫 2012-12-13
  • 打赏
  • 举报
回复
int sendResult = send(localSendSocket, buf, (int)strlen(buf), 0 ); 这一句不能保证一次把buf的数据全部发送完整。
internet91 2012-12-13
  • 打赏
  • 举报
回复
奇怪的是有时候能收到几条,但都不够20天,而且不稳定,一会3条,一会8条,一会只有一条。 我的服务器程序接收代码如下: //建立流式套接字 //SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); SOCKET listenSocket = System::tcpSocket; //构造本地地址数据结构 sockaddr_in addr; int nSockErr; addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//htonl(INADDR_ANY); addr.sin_family = AF_INET; addr.sin_port=htons(5656); //绑定套接字 if (bind(listenSocket,(struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) { nSockErr = WSAGetLastError(); AfxMessageBox("错误...\n"); } //将套接字设置成监听状态 if (listen(listenSocket, 5) == SOCKET_ERROR) { nSockErr = WSAGetLastError(); AfxMessageBox("错误...\n"); } //设置阻塞 unsigned long Mode = 0; //0:阻塞, 1:非阻塞 ioctlsocket(listenSocket, FIONBIO, (unsigned long*)&Mode); //等待客户的链接请求 CString fileFullName = "UUTemp/1-test.dat"; while (true) { SOCKET clientSocket = accept(listenSocket, NULL, NULL); if (clientSocket == INVALID_SOCKET) { AfxMessageBox("错误:客户端无效!\n"); nSockErr = WSAGetLastError(); } else { //有客户链接请求被成功接收 char buf[2048]; //1024*10 memset(buf, 0, sizeof(char)*2048); //接收客户端传输过来的数据 int n = recv(clientSocket, buf, 2048, 0); if (n>0) { //接收到的文件写入 CString s; s.Format("服务器已经接受%d个字符:%s\n", n, buf); //AfxMessageBox(s); //printf("服务器已经接受%d个字符:%s\n",n,buf); //把接收到的数据写入到文件中 CFile file; //先判断文件存在不存在,如果不存在,则创建 if( !file.Open(fileFullName, CFile::modeWrite|CFile::typeBinary) ) { //文件不存在 file.Open(fileFullName, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary); } else { //如果文件存在,移动到最后位置 file.SeekToEnd(); } //往文件中追加数据 file.Write(buf, n); //关闭文件 file.Close(); } } closesocket(clientSocket); } //关闭套接字 closesocket(listenSocket);
xumaojun 2012-12-13
  • 打赏
  • 举报
回复
recv数据次数与send数据次数不一定相等,如果没有网络原因,recv到的数据内容与发送的数据内容应该是一致的,可以通过抓包工具wireshark协助调试分析。
xiaohuh421 2012-12-13
  • 打赏
  • 举报
回复
接收端代码如何写的呢? 因为你没有发0结束符, 就算粘包也能接收完的, 只是看你的接收端是如何写的.
kingdom_0 2012-12-13
  • 打赏
  • 举报
回复
考虑是否粘包.
skyandcode 2012-12-13
  • 打赏
  • 举报
回复
你可以调试一下看看。
quwei197874 2012-12-13
  • 打赏
  • 举报
回复
引用 4 楼 skill11 的回复:
服务器端是循环接收消息的吗,还是只接收一条消息
服务端怎么接受看设定的,还分阻塞非阻塞
skill11 2012-12-13
  • 打赏
  • 举报
回复
服务器端是循环接收消息的吗,还是只接收一条消息
internet91 2012-12-12
  • 打赏
  • 举报
回复
收到的一条数据就是:"this is data send to the server!",并不是20个这样的数据合并到一条数据上:"this is data send to the server!this is data send to the server!......"。如果是20条数据合并到一条数据上,那也算正确。但现在是数据丢失,丢失了19个"this is data send to the server!"。
will_g 2012-12-12
  • 打赏
  • 举报
回复
并不是客户端调用一次send(),服务器的recv()就会收到一次数据.也可能是多次send的数据一次收到.
ShengFei01 2012-12-12
  • 打赏
  • 举报
回复
可以,但你得确定send成功了,可以拿这里有socket例子测试: http://download.csdn.net/detail/geoff08zhang/4571358

65,210

社区成员

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

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