C++ 套接字 - send() 和 connect()
C++ Socket - send() and connect()
我是套接字编程的新手。我正在用 C++ 制作客户端套接字,我的朋友正在制作服务器端套接字(也是用 C++),我们的目标是一起制作聊天应用程序。作为套接字编程的新手,我在互联网上搜索 C++ 套接字及相关内容,我收集了足够的信息来制作套接字并将一些东西发送到另一个套接字。问题出在 send
和 connect
函数上。我真的不明白我应该在其中包含哪些参数,以及如何初始化这些参数。我希望有更多经验的人可以解释它们是如何工作的,以及使用什么值作为参数。这是 MSDN 的代码示例。我希望有人帮助!不管怎样,谢谢!
int send(
_In_ SOCKET s,
_In_ const char *buf,
_In_ int len,
_In_ int flags
);
int connect(
_In_ SOCKET s,
_In_ const struct sockaddr *name,
_In_ int namelen
);
我已经知道如何创建套接字,所以我知道第一个参数是什么;是插座。
编辑 2:
这些是我使用的模块;我不确定它们是否是我应该使用的;我只是从我在网上看到的 C++ 套接字示例中复制了它们。
#include<iostream> //cout
#include<stdio.h> //printf
#include<string.h> //strlen
#include<string> //string
#include<sys/socket.h> //socket
#include<arpa/inet.h> //inet_addr
#include<netdb.h> //hostent
还有一件事 — 我正在使用 UDP 协议。不确定这是否会影响任何事情!
这是 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] = '[=10=]';
printf("%s\n", szBuffer);
}
}
}
}
}
if (sock != -1)
{
closesocket(sock);
sock = -1;
}
return 0;
}
我是套接字编程的新手。我正在用 C++ 制作客户端套接字,我的朋友正在制作服务器端套接字(也是用 C++),我们的目标是一起制作聊天应用程序。作为套接字编程的新手,我在互联网上搜索 C++ 套接字及相关内容,我收集了足够的信息来制作套接字并将一些东西发送到另一个套接字。问题出在 send
和 connect
函数上。我真的不明白我应该在其中包含哪些参数,以及如何初始化这些参数。我希望有更多经验的人可以解释它们是如何工作的,以及使用什么值作为参数。这是 MSDN 的代码示例。我希望有人帮助!不管怎样,谢谢!
int send(
_In_ SOCKET s,
_In_ const char *buf,
_In_ int len,
_In_ int flags
);
int connect(
_In_ SOCKET s,
_In_ const struct sockaddr *name,
_In_ int namelen
);
我已经知道如何创建套接字,所以我知道第一个参数是什么;是插座。
编辑 2:
这些是我使用的模块;我不确定它们是否是我应该使用的;我只是从我在网上看到的 C++ 套接字示例中复制了它们。
#include<iostream> //cout
#include<stdio.h> //printf
#include<string.h> //strlen
#include<string> //string
#include<sys/socket.h> //socket
#include<arpa/inet.h> //inet_addr
#include<netdb.h> //hostent
还有一件事 — 我正在使用 UDP 协议。不确定这是否会影响任何事情!
这是 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] = '[=10=]';
printf("%s\n", szBuffer);
}
}
}
}
}
if (sock != -1)
{
closesocket(sock);
sock = -1;
}
return 0;
}