对于我的Uni任务,我必须创建一个快节奏的网络游戏,因此选择使用UDP而不是TCP.我知道在UDP和TCP编程方面存在很多差异,并且已经阅读了关于winsock的MSDN文档的大部分相关部分.在MSDN上,它声明通过connect()函数创建UDP套接字应该将套接字绑定到指定的地址和端口,因此可以使用send()和recv()函数与创建的套接字.
对于我的应用程序,我创建一个客户端并使用loopback地址使用connect(),该地址通过send()函数发送大量数据包.客户端在调用select()之后,然后接收它发出的数据包.但是我从recv()函数得到的结果是SOCKET_ERROR,使用WSAGetLastError()的错误描述是"现有连接被远程主机强行关闭".
如果我使用bind()函数并使用sendto()通过环回地址发送数据,我recv()数据包没有任何错误...有谁知道为什么connect()函数没有做它应该做的事情,有没有人能够使用UDP套接字与connect()函数?
我是winsock的新手,我尝试编写一个接受新连接的服务器套接字,然后调用外部可执行文件.我们如何将外部可执行文件的stdin和stdout重定向到已被接受的客户端套接字.我用Google搜索并找到了下面的代码,但它不起作用.新流程已成功创建,但客户端无法从新流程接收任何数据.我使用的是Windows 7和Visual Studio 2008 Express版.任何帮助和评论表示赞赏.非常感谢!
服务器
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")
#define DEFAULT_PORT "27015"
#define DEFAULT_BUFLEN 512
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
int iResult;
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
struct addrinfo *result = NULL, *ptr = NULL, hints;
ZeroMemory(&hints, sizeof (hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
// Resolve the local address and port to be used by the server
iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, …Run Code Online (Sandbox Code Playgroud) 我开始学习C(套接字)和Internet协议中的网络编程.
目前我专注于HTTP.
在使用C实现HTTP客户端的(非常)短暂体验期间,我发现有时您必须多次调用recv()才能从服务器获取整个消息 - 即使客户端没有向客户端发送消息服务器之间的单独调用recv().
例如:
当我尝试使用recv()调用实现HTTP客户端时,我只得到了标题(我想,我仍然是HTTP的新手).但是当我两次调用recv()时,我在第一次调用中获得了头文件,在第二次调用中获得了body(html代码).
这不是短缓冲区的问题,因为我使用的缓冲区足够长以容纳整个消息.
为什么会这样?虽然没有客户端发送的新数据,但客户端必须多次调用recv()的原因是什么?我认为如果客户端没有向服务器发送新数据,对recv()的调用将带来服务器的整个响应.
我不认为这是我的代码的问题,但如果你要问代码,我可以在这里发布它没有问题.我认为这是不必要的,如果我错了,请纠正我.
我不认为这是相关的,但我正在使用Winsock2.
我想要一个WSARecv精度.
基本上你似乎可以使用带有WSABUF数组的函数.
1-在没有完成端口的重叠I/O上下文中,假设我在具有48个WSABUF数组的数据报套接字上使用WSARecv(),这是否意味着我可以在一个数据包中接收48个不同的UDP数据包(每个缓冲区1个数据包)打电话(说他们到达同一时刻)?或者接收48个数据包的唯一方法是在事件发出信号后使用WSARecv()48次(使用带事件的重叠I/O但不是完成端口,我再说一遍).
2-在一个上下文WITH I/O完成端口/重叠的I/O,它意味着我可以更换这个
int n = 48;
for (int i = 0; i < n; i++)
WSARecv(sock, &buffer_array[i], 1, NULL, 0, &overlapped, completion_routine);
Run Code Online (Sandbox Code Playgroud)
有了这个?
WSARecv(sock, buffer_array, 48, NULL, 0, &overlapped, completion_routine);
Run Code Online (Sandbox Code Playgroud)
基本上它是否意味着调用带有48个缓冲区的WSARecv()将发布48个读取请求?
3-如果不是,一组WSABUF的目的是什么?我的意思是,只有一个正确的尺寸就足够了吗?
非常感谢!
我正在学习Winsock和我在发送和接收一个简单的字符串时遇到一个奇怪的问题.这是我的代码(纯C):
//...
//Declarations and stuff
//----------- SEND SOME DATA -------------------------------------------------
char string1[] = "string-1";
int bytes_sent = 0;
bytes_sent = send(client_socket, string1, strlen(string1), 0);
printf("BYTES SENT: %i\n", bytes_sent);
printf("\n-----------------------------------------------\n\n");
system("pause");
//...
Run Code Online (Sandbox Code Playgroud)
//...
//Declarations and stuff
//----------- START LISTENING FOR REQUESTS ------------------------------------
SOCKET ClientSocket;
#define BUFFER_SIZE 256
int size;
struct sockaddr_in client_info;
char client_ip[16];
char data_received[BUFFER_SIZE];
int bytes_received = 0;
listen(ListenSocket, SOMAXCONN);
while(1){
ClientSocket = accept(ListenSocket, (struct sockaddr *)&client_info, &size);
strcpy(client_ip, inet_ntoa(client_info.sin_addr));
do{
bytes_received = recv(ClientSocket, data_received, BUFFER_SIZE, 0); …Run Code Online (Sandbox Code Playgroud) 昨天我试图用 C++ 制作一个套接字服务器,但在编译时出现错误。错误:
错误 6 错误 LNK2019:函数“public: static unsigned long __cdecl Env::GetSocket(void)” (?GetSocket@Env@@SAKXZ) C:\Users\JoshuaTha\Documents\Visual 中引用了未解析的外部符号 _ imp _socket@12 Studio 2010\Projects\HabboV5\HabboV5\Network.obj HabboV5
错误 5 错误 LNK2019:未解析的外部符号 _ imp _listen@8 在函数“public: void __thiscall Network::Start(void)” (?Start@Network@@QAEXXZ) C:\Users\JoshuaTha\Documents\Visual Studio 2010 中引用\Projects\HabboV5\HabboV5\Network.obj HabboV5
错误 4 错误 LNK2019:未解析的外部符号 _ imp _htons@4 在函数“public: void __thiscall Network::Start(void)” (?Start@Network@@QAEXXZ) C:\Users\JoshuaTha\Documents\Visual Studio 2010 中引用\Projects\HabboV5\HabboV5\Network.obj HabboV5
错误 3 错误 LNK2019:未解析的外部符号 _ imp _bind@12 在函数“public: void __thiscall Network::Start(void)” (?Start@Network@@QAEXXZ) C:\Users\JoshuaTha\Documents\Visual Studio 2010 中引用\Projects\HabboV5\HabboV5\Network.obj HabboV5
错误 2 错误 LNK2001:未解析的外部符号“public: static class Network * …
在UDP客户端/服务器上阻止DoS攻击有哪些好的编程实践?目前唯一想到的是忽略具有错误源的数据包,因此(使用WinSock2):
if (oSourceAddr.sa_family == AF_INET) {
uSourceAddr = inet_addr(oSourceAddr.sa_data);
if (uSourceAddr == oCorrectDestAddr.sin_addr.S_un.S_addr) {
queueBuffer.push(std::string(aBuffer));
}
}
Run Code Online (Sandbox Code Playgroud)
足够快的攻击可能导致这种情况在循环中阻塞 - 特别是如果数据包大小很小.有没有办法可以防止数据包来自某个来源,或者除了正确来源之外的任何来源?我应该注意哪些其他事项?如果解决方案已内置到API中,则代码形式的解释将特别有用.
我正在 Windows 中使用 WinSock 2.0 开发代理服务器。如果我想在阻塞模型中开发它, select() 是等待客户端或远程服务器从中接收数据的方式。是否有任何适用的方法可以使用 I/O 完成端口来做到这一点?
我曾经使用 I/O 完成端口为两个方向的数据提供两个上下文。但是有一个 WSARecv 挂起无法从远程服务器接收任何数据!我找不到问题所在。
提前致谢。
编辑。这是当前开发的 I/O 完成端口上的 WorkerThread 代码。但我问的是如何实现 select() 等效性。
主要原因是因为我通过套接字发送 Unicode 数据(字节,而不是字符),并且我想确保字节序匹配,因为 wchar_t 是 UTF16。
接收程序也是我的另一个程序,所以我会知道它是 UTF16 并且能够做出相应的反应。
这是我目前的算法,这种算法有效,但结果很奇怪。(这是在同一个应用程序中,因为我想在发送之前学习如何转换它)
case WM_CREATE: {
//Convert String to NetworkByte
wchar_t Data[] = L"This is a string";
char* DataA = (char*)Data;
unsigned short uData = htons((unsigned int)DataA);
//Convert String to HostByte
unsigned short hData = ntohs(uData);
DataA = (char*)&hData;
wchar_t* DataW = (wchar_t*)DataA;
MessageBeep(0);
break;
}
Run Code Online (Sandbox Code Playgroud)
结果:
??????????????????This is a string
Run Code Online (Sandbox Code Playgroud) 我目前正在使用 Winsock 2 开发一个 C++ 网络程序,它是一个在两台计算机之间没有服务器的聊天程序。如果没有用户被迫运行具有侦听器的服务器程序,这将很方便,这使得他们必须进行端口转发。当然,这会要求他们都输入彼此的 IP,但这没关系。有没有一种方法可以通过在两台不同的计算机上运行相同的客户端程序、使用相同的端口并且每台计算机输入另一台计算机的IP而无需端口转发来创建TCP连接?
winsock2 ×10
c++ ×6
c ×5
sockets ×3
winsock ×3
tcp ×2
asynchronous ×1
http ×1
networking ×1
security ×1
udp ×1
web ×1
winapi ×1
windows ×1
winsockets ×1