C ++ Socket - send()和connect()

时间:2017-04-06 19:33:30

标签: c++ sockets connect send

我是socket编程的新手。我正在用C ++创建一个客户端套接字,我的朋友正在制作一个服务器端套接字(也是用C ++),我们的目标是一起创建一个聊天应用程序。作为socket编程的新手,我在C ++ socket和相关的网上搜索,我收集了足够的信息来制作套接字并将内容发送到另一个套接字。问题出在sendconnect函数上。我真的不明白我应该在哪些参数,以及如何初始化它们。我希望有经验的人可以解释他们的工作方式,以及用作参数的值。这是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协议。不确定这是否会影响任何事情,谢谢!

1 个答案:

答案 0 :(得分:0)

这是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;
}