TCPsocket丢包,请求大佬支援

a2129981 2019-05-22 08:29:50
小弟萌新,在WIN10上根据大佬的博客,用TCP做了一个简单的传输正弦波函数的程序,然后接收端只能接受大约2.5万个数据,之后就停止了,而且中间会有一部分丢包,大约一两百个数据,求大佬们指导一下,感谢感谢

这个是sever程序:

#include<iostream>
#include<WinSock2.h>
#include <Ws2tcpip.h>
#include<math.h>
#define M_PI 3.14159265358979323846
#define CONNECT_NUM_MAX 10

#pragma comment(lib, "ws2_32.lib")


using namespace std;


int main()
{
double x = 0;
double y;
//加载套接字库
WSADATA wsaData;
int iRet = 0;
iRet = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iRet != 0)
{
cout << "WSAStartup(MAKEWORD(2, 2), &wsaData) execute failed!" << endl;;
return -1;
}
if (2 != LOBYTE(wsaData.wVersion) || 2 != HIBYTE(wsaData.wVersion))
{
WSACleanup();
cout << "WSADATA version is not correct!" << endl;
return -1;
}

//创建套接字
SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == INVALID_SOCKET)
{
cout << "serverSocket = socket(AF_INET, SOCK_STREAM, 0) execute failed!" << endl;
return -1;
}

//初始化服务器地址族变量
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);

//绑定
iRet = bind(serverSocket, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
if (iRet == SOCKET_ERROR)
{
cout << "bind(serverSocket, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)) execute failed!" << endl;
return -1;
}


//监听
iRet = listen(serverSocket, CONNECT_NUM_MAX);
if (iRet == SOCKET_ERROR)
{
cout << "listen(serverSocket, 10) execute failed!" << endl;
return -1;
}
else
{
cout << "Server is listening on " << addrSrv.sin_addr.S_un.S_addr << ":" << addrSrv.sin_port << "." << endl;
}

//等待连接_接收_发送
SOCKADDR_IN clientAddr;
int len = sizeof(SOCKADDR);
while (1)
{
SOCKET connSocket = accept(serverSocket, (SOCKADDR*)&clientAddr, &len);
if (connSocket == INVALID_SOCKET)
{
cout << "accept(serverSocket, (SOCKADDR*)&clientAddr, &len) execute failed!" << endl;
return -1;
}
else
{
cout << "Connection established! Waiting for messages." << endl;
}


int z = 0;
while (true)
{
//接收消息
char recvBuf[100];
int sig = recv(connSocket, recvBuf, 100, 0);
//没有连接时断开
if (sig <= 0)
{
printf("Error: Lost connection!\n");
break;
}
printf("%s\n", recvBuf);

//发送消息
char sendBuf[100];
//sprintf_s(sendBuf, "Welcome %s", inet_ntoa(clientAddr.sin_addr));
char str[INET_ADDRSTRLEN];
for (int k=1;k<2;k--)
{
y = sin(x);
x = x + M_PI/1000;
sprintf_s(sendBuf,"%f %d\n",y,z);
printf(sendBuf);
send(connSocket, sendBuf, strlen(sendBuf)+1,0);
z++;
}

break;
}

//关闭连接
closesocket(connSocket);
}

system("pause");
return 0;
}


这个是client程序:
#include<iostream>
#include <winsock2.h>
#include <Ws2tcpip.h>


using namespace std;

#pragma comment(lib, "ws2_32.lib")


int main()
{
//加载套接字库
WSADATA wsaData;
int iRet = 0;
iRet = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iRet != 0)
{
cout << "WSAStartup(MAKEWORD(2, 2), &wsaData) execute failed!" << endl;
return -1;
}
if (2 != LOBYTE(wsaData.wVersion) || 2 != HIBYTE(wsaData.wVersion))
{
WSACleanup();
cout << "WSADATA version is not correct!" << endl;
return -1;
}

//创建套接字
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket == INVALID_SOCKET)
{
cout << "clientSocket = socket(AF_INET, SOCK_STREAM, 0) execute failed!" << endl;
return -1;
}

//初始化服务器端地址族变量
SOCKADDR_IN srvAddr;
//srvAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
inet_pton(AF_INET, "127.0.0.1", &srvAddr.sin_addr);
srvAddr.sin_family = AF_INET;
srvAddr.sin_port = htons(6000);

//连接服务器
iRet = connect(clientSocket, (SOCKADDR*)&srvAddr, sizeof(SOCKADDR));
if (0 != iRet)
{
cout << "connect(clientSocket, (SOCKADDR*)&srvAddr, sizeof(SOCKADDR)) execute failed!" << endl;
return -1;
}

int x = 0;

while (true)
{


//发送消息
char sendBuf[100];
sprintf_s(sendBuf, "Hello, this is client bunny!");
send(clientSocket, sendBuf, strlen(sendBuf) + 1, 0);

//接收消息
char recvBuf[100];
int sig = recv(clientSocket, recvBuf, 100, 0);
//没有连接时断开
if (sig <= 0)
{
printf("Error: Lost connection!\n");
break;
}
printf("%s", recvBuf);


//跳出



}

//清理
closesocket(clientSocket);
WSACleanup();

system("pause");
return 0;
}
...全文
68 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2019-05-23
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545

64,654

社区成员

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

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