2017-04-06 159 views
0

新的套接字编程。我在C++中制作了一个客户端套接字,我的朋友正在制作一个服务器端套接字(同样在C++中),而且我们的目标是让聊天应用程序变得更简单。作为套接字编程的新手,我在C++套接字上搜索互联网并进行了关联,并且收集了足够的信息来创建套接字并将某些内容发送给另一个套接字。问题在于send()和connect()函数。我真的不明白我应该有什么参数以及如何初始化参数。我跳过一些更多的经验可以向我解释他们是如何工作的,以及对参数有什么价值,有msdn网站没有清楚地解释我应该使用的女巫值。这是msdn的代码示例,希望有人帮助!无论如何,谢谢!C++套接字 - 发送()和连接()

发送():

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 
); 

PS>我alreaddy知道如何创造一个插座(初始化),所以我知道发生的事情是第一个参数,其插座名称:p

编辑2:

这些都是我用,我不确定他们是否在一个inclues重新那些我应该或不应该使用的,我只是复制他们从我看到的在线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协议的IM,不知道这会影响annything寿!

+0

C++标准没有套接字类。在你的问题中包括你使用的库和更多的上下文。我认为我所看到的是Winsock或BSD套接字。 –

+0

关于编写套接字代码有很多书籍和教程。你需要阅读其中的一个,它们将包含示例。 SO并不是获得这种基本指导的地方。 – Barmar

+0

嗯,我做了研究,但我不明白我看到了什么,所以我跳了一个人可以在这里解释它 – thecner

回答

0

这是一个纯粹的Windows套接字客户端。它连接到Google并发出GET请求并转储结果。因人而异。

#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; 
} 
+0

非常感谢!虐待代码和ty来理解它! TY – thecner