TCP 连接时, 发送接受数据的问题

wang7890 2008-07-10 11:30:45
我使用TCP 连接进行数据的发送接受, 可能由于网络繁忙,socket 不能一次发送或接收到所有数据, 对于程序,我如何去控制接收和发送完整的数据呢??

发送: int nSend = send(socket, buff, nSendLen, 0);

接收: int nRecv = recv(socket,szText, 300, 0);

对于这一块,我如何控制?

请大家赐教,谢谢!
...全文
159 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangdeqie 2008-07-11
  • 打赏
  • 举报
回复
不好意思,网络编程我也是初学!
wangdeqie 2008-07-11
  • 打赏
  • 举报
回复

我这段程序是一个基于TCP客户端/服务器端通信的简单小例子,通过字符串数组来存储发送的数据,你可以自己判断下,发送的字符串和接收的字符串是否相等。
lin_style 2008-07-11
  • 打赏
  • 举报
回复
先看看来源数据会不会很多。如果不会很多。

500MS读
500MS写

不会比多线程慢
lin_style 2008-07-11
  • 打赏
  • 举报
回复
int CCreateTCP_UDP::Readn(int fd, void *vptr, size_t nbytes)
{
size_t nleft;
ssize_t nread;
char *ptr;

ptr = (char*)vptr;
nleft = nbytes;
while (nleft > 0)
{
if ( (nread = read(fd, ptr, nleft)) < 0)
{
if (errno == EINTR)
nread = 0; /* and call read() again */
else
return(-1);
} else if (nread == 0)
break; /* EOF */

nleft -= nread;
ptr += nread;
}
return(nbytes - nleft); /* return >= 0 */
}



这样读。。。
冷月清晖 2008-07-11
  • 打赏
  • 举报
回复
TCP ?

发送与接收中间的不用你管了。

你只要负责 发送端不停的读数据,发,接收端不停地收,存储数据就行了,知道接收到停止命令退出发,收 线程。
偶像罗斯福 2008-07-10
  • 打赏
  • 举报
回复
给你发送的包编号---
接收的时候按编号组织起来。
独孤过儿 2008-07-10
  • 打赏
  • 举报
回复
不能一次发送或接受到所有数据,这个应该不是因为网络的congestion吧,应该是传输通道的MTU问题吧,建议先check一下MTU的问题。若果是,

可以考虑分包和重组...
wang7890 2008-07-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wangdeqie 的回复:]
你可以参考下这个程序:

C/C++ code
//vc6.0下运行ConSole Project
//---TcpClient.cpp---
#include <WINSOCK2.H>
#include <stdio.h>
void main()
{
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if (err!=0)
{
return;
}
if (LOBYTE(wsaData.wVer…
[/Quote]

能不能详细说明一下, 没有看明白接/发数据的时候,对数据是否接收完整的校验阿什么的??

谢谢
lily604 2008-07-10
  • 打赏
  • 举报
回复
wangdeqie 2008-07-10
  • 打赏
  • 举报
回复
你可以参考下这个程序:

//vc6.0下运行ConSole Project
//---TcpClient.cpp---
#include <WINSOCK2.H>
#include <stdio.h>
void main()
{
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if (err!=0)
{
return;
}
if (LOBYTE(wsaData.wVersion)!=1 ||
HIBYTE(wsaData.wVersion)!=1 )
{
WSACleanup();
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.173.129");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
//向服务器发出连接请求
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

//接收数据
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
//发送数据
send(sockClient,"This is lisi",strlen("This is lisi")+1,0);
//关闭套接字
closesocket(sockClient);
WSACleanup();
}
//---TCPSrv.cpp---
#include <WINSOCK2.H>
#include <stdio.h>
void main()
{
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if (err!=0)
{
return;
}
if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup();
return;
}
//创建用于监听的套接字
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);

//绑定套接字
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//将套接字设成监听模式,准备接受客户请求
listen(sockSrv,5);

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while (1)
{
//等待客户请求到来
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[100];
sprintf(sendBuf,"Welcome %s to http://www.sunxin.org",
inet_ntoa(addrClient.sin_addr));
//发送数据
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
//接收数据
recv(sockConn,recvBuf,100,0);
//打印接收的数据
printf("%s\n",recvBuf);
//关闭套接字
closesocket(sockConn);
}

}

64,637

社区成员

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

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