18,356
社区成员
发帖
与我相关
我的任务
分享
#include "stdlib.h"
int main(int argc, char* argv[])
{
WSADATA wsadata;
WSAStartup(0x0202, &wsadata);
sockaddr_in addrTo;
struct hostent *he = gethostbyname("localhost");
ASSERT(he != NULL);
if (he)
{
addrTo.sin_family = AF_INET;
addrTo.sin_addr = *((struct in_addr *)he->h_addr);
addrTo.sin_port = htons(1001);
}
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock == INVALID_SOCKET)
{
return SOCKET_ERROR;
}
// 非阻塞不等于立即返回,UDP是立即模式,所以仍将等到所有数据被发送才返回。
// 故此处设置非阻塞似无意义。
u_long val = TRUE;
VERIFY(ioctlsocket(sock, FIONBIO, &val) != SOCKET_ERROR);
int nRet = 0;
while (nRet != SOCKET_ERROR)
{
nRet = sendto(sock, "1234", 4, 0, (sockaddr *)&addrTo, sizeof(addrTo));
}
system("pause");
return 0;
}
#include <string>
using namespace std;
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
int main(int argc, char* argv[])
{
WSADATA wsadata;
WSAStartup(0x0202, &wsadata);
sockaddr_in addrTo;
struct hostent *he = gethostbyname("192.168.1.99"); // 局域网内另一台机器
if (he)
{
addrTo.sin_family = AF_INET;
addrTo.sin_addr = *((struct in_addr *)he->h_addr);
addrTo.sin_port = htons(1001);
}
else
{
return SOCKET_ERROR;
}
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock == INVALID_SOCKET)
{
return SOCKET_ERROR;
}
int nRet = 0;
// 设置非阻塞。好像又管用了,设置之后发送可能返回10035或10055。
// u_long val = TRUE;
// nRet = ioctlsocket(sock, FIONBIO, &val);
// if (nRet == SOCKET_ERROR)
// {
// return SOCKET_ERROR;
// }
// 设置发送缓存区的大小,只在非阻塞时有影响。
// int nSendBufSize = 1;
// nRet = setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (const char*)&nSendBufSize, sizeof(nSendBufSize));
// if (nRet == SOCKET_ERROR)
// {
// return SOCKET_ERROR;
// }
string strTemp;
strTemp.resize(1500); // 65507
while (nRet != SOCKET_ERROR)
{
nRet = sendto(sock, strTemp.data(), strTemp.size(), 0, (sockaddr *)&addrTo, sizeof(addrTo));
}
int nError = WSAGetLastError();
printf("WSAGetLastError() = %d", nError);
system("pause");
return 0;
}
int nSendBuf = 100*1024;
int nRet = setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (const char*)&nSendBuf, sizeof(int)); // 设置虽然成功但是好像没有用,把这里的100k改成1,下面发63k大小反而可以成功。
ASSERT(nRet != SOCKET_ERROR);
string strTemp;
strTemp.resize(64*1024);
nRet = sendto(sock, strTemp.data(), strTemp.size(), 0, (sockaddr *)&addrTo, sizeof(addrTo));
if (nRet == SOCKET_ERROR)
{
int werr = WSAGetLastError(); // 10040 缓存区不足
printf("werr=%d", werr);
}