Исходник для работы с HTTP (C++)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by s_p_a_m, 13 Jul 2009.

  1. s_p_a_m

    s_p_a_m Elder - Старейшина

    Joined:
    8 Feb 2008
    Messages:
    100
    Likes Received:
    58
    Reputations:
    4
    может есть у кого сабж? нужен просто пример (желательно консоль) для отправки данных на серв и получение ответа. Например логин на сайт и получение удачно\неудочно ... и в соответствии с этим выполняем действие... если у кого есть поделитесь :)
     
  2. POS_troi

    POS_troi Elder - Старейшина

    Joined:
    1 Dec 2006
    Messages:
    1,569
    Likes Received:
    466
    Reputations:
    108
    http://forum.sources.ru/index.php?showtopic=166220

    посмотри


    и вот еще в исходниках валялось
    Code:
    #include <stdio.h>
    #include <winsock.h>
     
    // Function prototype
    void StreamClient(char *szServer, short nPort, char *szMessage);
    // Helper macro for displaying errors
    #define PRINTERROR(s)	\
    		fprintf(stderr,"\n%: %d\n", s, WSAGetLastError())
     
     
     
    ////////////////////////////////////////////////////////////
     
    void main(int argc, char **argv)
    {
    	WORD wVersionRequested = MAKEWORD(2,0);
    	WSADATA wsaData;
    	int nRet;
    	short nPort;
     
    	//
    	// Check for the host and port arguments
    	//
    	if (argc != 4)
    	{
    		fprintf(stderr,"\nSyntax: client ServerName PortNumber Message\n");
    		return;
    	}
     
    	nPort = atoi(argv[2]);
     
     
    	//
    	// Initialize WinSock and check the version
    	//
    	nRet = WSAStartup(wVersionRequested, &wsaData);
     
    	//
    	// Go do the stuff a stream client does
    	//
    	StreamClient(argv[1], nPort, argv[3]);
     
     
    	//
    	// Release WinSock
    	//
    	WSACleanup();
    }
     
    ////////////////////////////////////////////////////////////
     
    void StreamClient(char *szServer, short nPort, char *szMessage)
    {
    	printf("\nStream Client connecting to server: %s on port: %d",
    				szServer, nPort);
     
    	//
    	// Find the server
    	//
        LPHOSTENT lpHostEntry;
     
    	lpHostEntry = gethostbyname(szServer);
        if (lpHostEntry == NULL)
        {
            PRINTERROR("gethostbyname()");
            return;
        }
     
    	//
    	// Create a TCP/IP stream socket
    	//
    	SOCKET	theSocket;
     
    	theSocket = socket(AF_INET,				// Address family
    					   SOCK_STREAM,			// Socket type
    					   IPPROTO_TCP);		// Protocol
    	if (theSocket == INVALID_SOCKET)
    	{
    		PRINTERROR("socket()");
    		return;
    	}
     
    	//
    	// Fill in the address structure
    	//
    	SOCKADDR_IN saServer;
     
    	saServer.sin_family = AF_INET;
    	saServer.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);
    										// ^ Server's address
    	saServer.sin_port = htons(nPort);	// Port number from command line
     
    	//
    	// connect to the server
    	//
    	int nRet;
     
    	nRet = connect(theSocket,				// Socket
    				   (LPSOCKADDR)&saServer,	// Server address
    				   sizeof(struct sockaddr));// Length of server address structure
    	if (nRet == SOCKET_ERROR)
    	{
    		PRINTERROR("socket()");
    		closesocket(theSocket);
    		return;
    	}
     
     
    	//
    	// Send data to the server
    	//
        
        char szBuf[256];
     
    	// strcpy(szBuf, "From the Client");
    	nRet = send(theSocket,				// Connected socket
    				szMessage,					// Data buffer
    				strlen(szMessage),			// Length of data
    				0);						// Flags
    	if (nRet == SOCKET_ERROR)
    	{
    		PRINTERROR("send()");
    		closesocket(theSocket);
    		return;
    	}
     
     
    	//
    	// Wait for a reply
    	//
    	nRet = recv(theSocket,				// Connected socket
    				szBuf,					// Receive buffer
    				sizeof(szBuf)+1,			// Size of receive buffer
    				0);						// Flags
    	if (nRet == SOCKET_ERROR)
    	{
    		PRINTERROR("recv()");
    		closesocket(theSocket);
    		return;
    	}
     
     
    	//
    	// Display the received data
    	//
    	printf("\nData received: %s", szBuf);
     
     
    	closesocket(theSocket);
    	return;
    }
    
    
     
    1 person likes this.
  3. s_p_a_m

    s_p_a_m Elder - Старейшина

    Joined:
    8 Feb 2008
    Messages:
    100
    Likes Received:
    58
    Reputations:
    4
    это я так понял TCP/IP ? я не силен в С++ если можно то конкретно сорс по отправке ПОСТ на сервер. с меня +++, заранее спасибо
     
  4. POS_troi

    POS_troi Elder - Старейшина

    Joined:
    1 Dec 2006
    Messages:
    1,569
    Likes Received:
    466
    Reputations:
    108
    как вариант - посмотри вот это..
    если не то и никто не скинет еще ченить , то когда прийду домой, скину исходник програмулины (писал для партнерки одной, там все и GET и POST)

    Code:
    
    #include <stdio.h>
    #include <string.h>
    #include <winsock2.h>
    #include <windows.h>
    #include <ctype.h>
    
    #define PORT 80         //  Порт, через который идет подключение к серверу....21,80,25,110 и т.п.
    #define SERVERADDR "77.91.229.20"     // Адрес сервера
    
    int main ( int argc, char* argv [ ] )
    {
         WSADATA wd;
         char buff[10000];
         char buff2[9000]= {
    "POST /member.php HTTP/1.0\r\n"
    "Host: www.haddan.ru\r\n"
    "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.13) Gecko/20080311 AdCentriaIM/1.7 Firefox/2.0.0.13\r\n"
    "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
    "Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3\r\n"
    "Accept-Encoding: gzip,deflate\r\n"
    "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n"
    "Keep-Alive: 300\r\n"
    "Connection: keep-alive\r\n"
    "Referer: http://www.haddan.ru/\r\n"
    "Content-Type: application/x-www-form-urlencoded\r\n"
    "Content-Length: 33\r\n\r\n"
    "username=USER&passwd=PASS"
         };
    
         printf ( "TCP Client \n" ); // ну, тут и так понятно
         if ( WSAStartup ( 0x202, &wd ) )
         {
                 printf ( " WSAStart error  %d \n ", WSAGetLastError ( ) );
                 return -1;
         }
    
         SOCKET sock ;
         sock=socket ( AF_INET, SOCK_STREAM, 0 );
         if  ( sock < 0 )
         {
             printf (" Socket ( ) error    %d \n ", WSAGetLastError ( ) );
             return  -1;
         }
    
         sockaddr_in  dest_addr;
         dest_addr.sin_family=AF_INET; //инет коннектинг
         dest_addr.sin_port=htons ( PORT ); //порт
         HOSTENT    *hst;  // хост
         if( inet_addr(SERVERADDR) != INADDR_NONE )     
             dest_addr.sin_addr.S_un.S_addr = inet_addr(SERVERADDR);
         else if( hst=gethostbyname ( SERVERADDR ) )    
             ( ( unsigned long   * ) &dest_addr.sin_addr )[0]=((unsigned long** )hst->h_addr_list)[0][0];
         else
         {
                printf( "invalid address  %s \n", SERVERADDR );
                closesocket( sock ) ;
                WSACleanup();
                return  -1;
         }
    
         if(connect( sock, (sockaddr *)&dest_addr, sizeof(dest_addr) ))
         {
                printf (" Connect error  %d \n ", WSAGetLastError ( ) );
                return -1;
         }
    
         //sprintf( buff2, "GET /room/func/mine.php HTTP/1.1\r\nHost: haddan.ru\r\nConnection: Close\r\n\r\n");
         send( sock, buff2, sizeof(buff2), 0);
         recv( sock, buff, sizeof(buff)-1, 0 );
         //for(int i=0; i < strlen(buff); i++)
         //    if(isalnum(buff[i]) || buff[i] == '<'|| buff[i] == '>' || buff[i] == '/')
                 printf("%s",buff );
         //    else
         //        continue;
             printf("\n");
         printf ("Connection with %s succesfully. quit - quit" , SERVERADDR );
         //int nsize;
         /*while( ( nsize = recv( sock, buff, sizeof(buff)-1, 0 ) ) != SOCKET_ERROR )
         {
                 buff[ nsize ] =0;
                 printf ( " S=>C: %s ", buff  ) ;
                 printf ( "S<=C: " ) ;
                 fgets ( &buff [0], sizeof( buff )-1, stdin );
                 if  ( !strcmp ( &buff[0], "quit\n" ) )
                 {
                         printf ( " Exit " );
                         closesocket ( sock ) ; //выход правильный
                         WSACleanup() ;
                         return 0;
                 }
                 send ( sock, &buff [ 0 ], nsize, 0 ) ;
          }*/
    
          //printf ( " Recv error  %d \n", WSAGetLastError ( )  );
          //closesocket ( sock ) ;
          //WSACleanup ( ) ;
          return 0;
    }
    
    
    
     
  5. s_p_a_m

    s_p_a_m Elder - Старейшина

    Joined:
    8 Feb 2008
    Messages:
    100
    Likes Received:
    58
    Reputations:
    4
    спс, буду ждать
     
  6. SeNaP

    SeNaP Elder - Старейшина

    Joined:
    7 Aug 2008
    Messages:
    378
    Likes Received:
    69
    Reputations:
    20
    АПчхи!

    У кого есть пример по компактнее ?
     
  7. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    юзайте curl и будет вам счастье. в комплекте с ним есть дофига исходников по применению каждой функции. Ну или если комактнее, и тока под винду, то юзайте WinInet
     
  8. SeNaP

    SeNaP Elder - Старейшина

    Joined:
    7 Aug 2008
    Messages:
    378
    Likes Received:
    69
    Reputations:
    20
    А если нужно принимать ответ от сервера, например какую нибудь команду, то тут только через сокет?
     
  9. D4mp

    D4mp Banned

    Joined:
    28 Jul 2010
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Ну дык ты отправляешь запрос, и получаешь этот самый ответ. Сам юзаю курл, доволен как слон. Главное подцепить его правильно =)