客戶端分別在阻塞和非阻塞的模式下分別回圈發送十次180萬大小和1800萬大小的char陣列,服務器端在accept之后會sleep30s在呼叫recv函式接受資料。
問題來了,我每次都輸出send函式的回傳值,是拷貝到快取區的資料大小,而我每次無論是發送180萬還是1800萬回傳的都是發送的大小,快取區有這么大?
其次,同樣是在非阻塞模式下,回圈發送十次180萬和1800萬資料,接受sleep30秒后才recv,send函式會把資料拷貝到快取區就回傳,那為什么兩種情況send函式都是只回圈兩次,第三次就發送失敗,這是為什么,一次3600萬一次360萬差別很大的啊。
下面上結果圖和代碼圖:
阻塞模式每次發送后會有延時都最終都能全部發完:

uj5u.com熱心網友回復:
非阻塞模式下:
uj5u.com熱心網友回復:
客戶端發送的時候,接收端都是在accept之后sleep30s再呼叫recv函式回圈接收。uj5u.com熱心網友回復:
客戶端代碼:發送的資料定義成了全域變數。下面是main函式里面的
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return 0;
}
if (LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return 0;
}
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
if (sockClient == INVALID_SOCKET)
{
cout << "client 創建套接字失敗" << WSAGetLastError() << endl;
/*wprintf(L "socketfailedwitherror:%ld\n", WSAGetLastError());
WSACleanup();
return 0;*/
}
else
cout << "client創建套接字成功\n";
u_long mode = 1;
ioctlsocket(sockClient, FIONBIO, &mode);
//控制為阻塞方式(0)。
unsigned int uiRcvBuf;
int uiRcvBufLen = sizeof(uiRcvBuf);
getsockopt(sockClient, SOL_SOCKET, SO_SNDBUF, (char*)&uiRcvBuf, &uiRcvBufLen);
/*if (SOCKET_ERROR == nErrCode)
{
return;
}*/
cout << "發送快取"<<uiRcvBuf << endl;
/*getsockopt(sockClient, SOL_SOCKET, SO_RCVBUF, (char*)&uiRcvBuf, &uiRcvBufLen);
cout << "接受快取" << uiRcvBuf << endl;*/
SOCKADDR_IN addrSrv;
inet_pton(AF_INET, "121.248.51.26", (void *)&addrSrv.sin_addr.S_un.S_addr);
//addrSrv.sin_addr.S_un.S_addr = inet_pton("127.0.0.1");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
int nErrCode=connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
if (SOCKET_ERROR == nErrCode)
{
cout << "client lianjie 失敗" << WSAGetLastError() << endl;
}
else
cout << "clientlianjie成功\n";
memset(recvBuf, '0', 9000000);
memset(recvBuf+9000000, '1', 9000000);
recvBuf[18000000] = '\0';
int jj = 10;
while (jj--)
{
nErrCode = send(sockClient, recvBuf, 18000000 + 1, 0);
if (SOCKET_ERROR == nErrCode)
{
cout << "client send 失敗:" << WSAGetLastError() << endl;
}
else
cout << nErrCode << " clientsend成功\n";
}
closesocket(sockClient);
WSACleanup();
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/119512.html
標籤:網絡通信
下一篇:如何修改程式的網路訪問優先級
