我是套接字编程的新手。我正在用 C++ 制作一个客户端套接字,我的朋友正在制作一个服务器端套接字(也是用 C++ 编写),我们的目标是一起制作一个聊天应用程序。作为套接字编程的新手,我在互联网上搜索 C++ 套接字及相关内容,并且收集了足够的信息来创建套接字并向另一个套接字发送内容。问题出在send和connect函数上。我真的不明白我应该在其中包含哪些参数,以及如何初始化这些参数。我希望有更多经验的人可以解释它们是如何工作的,以及使用什么值作为参数。这是 MSDN 的代码示例。我希望有人帮忙!不管怎样,谢谢!
int send(\n _In_ SOCKET s,\n _In_ const char *buf,\n _In_ int len,\n _In_ int flags\n);\n\nint connect(\n _In_ SOCKET s,\n _In_ const struct sockaddr *name,\n _In_ int namelen\n);\nRun Code Online (Sandbox Code Playgroud)\n\n我已经知道如何创建套接字,所以我知道第一个参数是什么;这是插座。
\n\n编辑2:
\n\n这些是我使用的模块;我不确定它们是否是我应该使用的;我只是从网上看到的 C++ 套接字示例中复制了它们。
\n\n#include<iostream> //cout\n#include<stdio.h> //printf\n#include<string.h> //strlen\n#include<string> //string\n#include<sys/socket.h> //socket\n#include<arpa/inet.h> //inet_addr\n#include<netdb.h> //hostent\nRun Code Online (Sandbox Code Playgroud)\n\n另一件事 \xe2\x80\x94 我正在使用 UDP 协议。不确定这是否会影响任何事情,呵呵!
\n这是 Windows 的最低限度套接字客户端。它连接到 Google 并发出 GET 请求并转储结果。YMMV。
#include <winsock2.h>
#include <WS2tcpip.h>
int ResolveHostName(const char* pszHostName, sockaddr_in* pAddr)
{
int ret;
HRESULT hr = S_OK;
addrinfo* pResultList = NULL;
addrinfo hints = {};
int result = -1;
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
ret = getaddrinfo(pszHostName, NULL, &hints, &pResultList);
result = (ret == 0) ? 1 : -1;
if (result != -1)
{
// just pick the first one found
*pAddr = *(sockaddr_in*)(pResultList->ai_addr);
result = 0;
}
if (pResultList != NULL)
{
::freeaddrinfo(pResultList);
}
return result;
}
int main()
{
SOCKET sock = -1;
WSADATA data = {};
sockaddr_in addrRemote = {};
int result;
WSAStartup(MAKEWORD(2, 2), &data);
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock != -1)
{
if (ResolveHostName("www.google.com", &addrRemote) != -1)
{
addrRemote.sin_port = htons(80);
result = connect(sock, (sockaddr*)&addrRemote, sizeof(addrRemote));
if (result != -1)
{
char* msg = "GET / HTTP/1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n";
int msg_len = strlen(msg);
result = send(sock, msg, msg_len, 0);
if (result != -1)
{
char szBuffer[10000+1];
result = recv(sock, szBuffer, 10000, 0);
if (result > 0)
{
// safely null terminate
szBuffer[result] = '\0';
printf("%s\n", szBuffer);
}
}
}
}
}
if (sock != -1)
{
closesocket(sock);
sock = -1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)