首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

Socket编程 TCP发送能不能循环调用send()步骤

2012-12-31 
Socket编程 TCP发送能不能循环调用send()方法本帖最后由 internet91 于 2012-12-12 21:47:40 编辑我调用se

Socket编程 TCP发送能不能循环调用send()方法
本帖最后由 internet91 于 2012-12-12 21:47:40 编辑 我调用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);
[解决办法]
可以,但你得确定send成功了,可以拿这里有socket例子测试:
http://download.csdn.net/detail/geoff08zhang/4571358
[解决办法]
并不是客户端调用一次send(),服务器的recv()就会收到一次数据.也可能是多次send的数据一次收到.
[解决办法]
服务器端是循环接收消息的吗,还是只接收一条消息
[解决办法]

引用:
服务器端是循环接收消息的吗,还是只接收一条消息
服务端怎么接受看设定的,还分阻塞非阻塞
[解决办法]
你可以调试一下看看。
[解决办法]
考虑是否粘包.
[解决办法]
接收端代码如何写的呢?

因为你没有发0结束符, 就算粘包也能接收完的, 只是看你的接收端是如何写的.
[解决办法]
recv数据次数与send数据次数不一定相等,如果没有网络原因,recv到的数据内容与发送的数据内容应该是一致的,可以通过抓包工具wireshark协助调试分析。
[解决办法]
int sendResult = send(localSendSocket, buf, (int)strlen(buf), 0 );
这一句不能保证一次把buf的数据全部发送完整。

热点排行