2016-04-10 1 views
0

Я попытался сделать этот код отправленными данными в файл php, а вместо него отправить его, он просто грубо возвращает отказ соединения, не имеет четкого понимания, почему, но все кажется мне прекраснымWinsock Doesnt Send, показывает неудачу подключения

#include "stdafx.h" 
#include <stdio.h> 
#include <stdlib.h> 
#include <windows.h> 
#include <Winsock.h> 

#pragma comment (lib, "ws2_32") 

int main() 
{ 
    char fname[32]; 
    printf("Enter Your name: \n"); 
    scanf("%31s",fname); 

    char lname[32]; 
    printf("Enter Your Last name: \n"); 
    scanf("%31s",lname); 

    char telnum[32]; 
    printf("Enter Your Tel Number: \n"); 
    scanf("%31s",telnum); 

    char email[32]; 
    printf("Enter Your Email: \n"); 
    scanf("%31s",email); 

    //Initiate Winsock 
    WSADATA wsaData; 
    int iResult = WSAStartup(MAKEWORD(2,2),&wsaData); 

    SOCKET m_socket; 
     if(m_socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP) ==INVALID_SOCKET) 
     { 
      printf("Invalid Socket :WSAGetLastError()"); 
     } 
     sockaddr_in clientService; 
    clientService.sin_family = AF_INET; 
    clientService.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    clientService.sin_port = htons(80); 
    LPHOSTENT host = gethostbyname("127.0.0.1"); 

    if(connect(m_socket,(SOCKADDR*)&clientService,sizeof(clientService))==SOCKET_ERROR) 
     { 
     printf("Connection Failure"); 
     WSACleanup(); 
     return 1; 
     } 

    char buffer[1024]; 

    strcpy(buffer,"POST /server/dbarea.php HTTP/1.1\n"); 
    strcat(buffer,"Content - Type:application/x-www-form-urlencoded\n"); 
    strcat(buffer,"Host: localhost\n"); 
    strcat(buffer,"content-Length: 32\n"); 
    strcat(buffer,"\n"); 
    strcat(buffer,"fname=%s&lname=%s&telnum=%s&email=%s"); 
    wsprintfA(buffer,fname, lname, telnum, email); 
    if(!send(m_socket, buffer, strlen(buffer), 0)) 
    { 
     printf("Not Sent ! Error : %d", GetLastError()); 
    } 
    else{ 
     MessageBoxA(NULL, "Message Sent", "", MB_OK); 
    } 
    return 0; 
} 

и PHP Похоже, это

<?php 
    $fname = $_POST['fname']; 
    $lname = $_POST['lname']; 
    $telnum = $_POST['telnum']; 
    $email = $_POST['email']; 

    $log = "Data : \n First Name: $fname\n Last Name: $lname\n Telephone : $telnum\n Email : $email"; 
    $file = fopen("datas.txt","w"); 
    fwrite($file, $log); 
    fclose($file); 
?> 
+0

Возможно, вы заблокированы брандмауэром Windows. Можете ли вы использовать telnet на своем сервере? Также возвращается 'WSAGetLastError'? –

+0

'strcat (buffer," fname =% s & lname =% s & telnum =% s & email =% s "); wsprintfA (buffer, fname, lname, telnum, email);' - Объясните, что вы пытаетесь сделать здесь. Вы создаете свой буфер с символьными данными с помощью 'strcat' и' strcpy', а затем вы удаляете всю эту работу, вызывая 'wsprintfA'. Кроме того, в строке формата 'fname' есть больше аргументов, чем указано вами, поэтому поведение не определено. – PaulMcKenzie

+0

Замените '' printf («Ошибка соединения»); '' с '' printf («Ошибка соединения. Код ошибки:% d», WSAGetLastError()); '', а затем посмотрите документацию [connect()] (https : //msdn.microsoft.com/en-us/library/windows/desktop/ms737625%28v=vs.85%29.aspx), чтобы узнать, что вызывает ошибку. – ub3rst4r

ответ

0

Есть несколько ошибок в этом коде, а именно malforming запроса HTTP, злоупотребление wsprintfA() и неправильная обработка ошибок на send().

Попробуйте что-то больше, как это вместо:

#include "stdafx.h" 
#include <stdio.h> 
#include <stdlib.h> 
#include <windows.h> 
#include <Winsock.h> 

#pragma comment (lib, "ws2_32") 

int main() 
{ 
    char fname[32]; 
    printf("Enter Your name: \n"); 
    scanf("%31s", fname); 

    char lname[32]; 
    printf("Enter Your Last name: \n"); 
    scanf("%31s", lname); 

    char telnum[32]; 
    printf("Enter Your Tel Number: \n"); 
    scanf("%31s", telnum); 

    char email[32]; 
    printf("Enter Your Email: \n"); 
    scanf("%31s", email); 

    //Initiate Winsock 
    WSADATA wsaData; 
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); 
    if (iResult != 0) 
    { 
     printf("WinSock failed: %d", iResult); 
     return 1; 
    } 

    SOCKET m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if (m_socket == INVALID_SOCKET) 
    { 
     printf("Invalid Socket: %d", WSAGetLastError()); 
     WSACleanup(); 
     return 1; 
    } 

    sockaddr_in clientService; 
    memset(&clientService, 0, sizeof(clientService)); 
    clientService.sin_family = AF_INET; 
    clientService.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    clientService.sin_port = htons(80); 

    if (connect(m_socket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR) 
    { 
     printf("Connection Failure: %d", WSAGetLastError()); 
     closesocket(m_socket); 
     WSACleanup(); 
     return 1; 
    } 

    char data[256]; 
    sprintf(data, "fname=%s&lname=%s&telnum=%s&email=%s", fname, lname, telnum, email); 

    char buffer[1024]; 
    strcpy(buffer, "POST /server/dbarea.php HTTP/1.1\r\n"); 
    strcat(buffer, "Content-Type: application/x-www-form-urlencoded\r\n"); 
    strcat(buffer, "Host: localhost\r\n"); 
    sprintf(&buffer[strlen(buffer)], "Content-Length: %d\r\n", strlen(data)); 
    strcat(buffer, "\r\n"); 
    strcat(buffer, data); 

    if (send(m_socket, buffer, strlen(buffer), 0) == SOCKET_ERROR) 
    { 
     printf("Not Sent ! Error : %d", WSAGetLastError()); 
     closesocket(m_socket); 
     WSACleanup(); 
     return 1; 
    } 

    closesocket(m_socket); 
    WSACleanup(); 

    MessageBoxA(NULL, "Message Sent", "", MB_OK); 

    return 0; 
} 

Это, как говорится, так как вы используете C++, вы должны использовать std::string и связанную функциональность, вместо того, чтобы прибегать к функциональности C.

#include "stdafx.h" 
#include <windows.h> 
#include <Winsock.h> 
#include <iostream> 
#include <string> 
#include <sstream> 
#include <stdexcept> 

#pragma comment (lib, "ws2_32") 

void error(const char *what, int errCode) 
{ 
    std::ostringstream oss; 
    oss << what << "! Error: " << errCode; 
    throw std::runtime_error(oss.str()); 
} 

struct sWsa 
{ 
    sWsa() 
    { 
     WSADATA wsaData; 
     int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); 
     if (iResult != 0) 
      error("WinSock failed", iResult); 
    } 

    ~sWsa() 
    { 
     WSACleanup(); 
    } 
}; 

struct sSocket 
{ 
    SOCKET m_Socket; 

    sSocket(SOCKET s) : m_Socket(s) {} 
    ~sSocket() 
    { 
     if (m_Socket != INVALID_SOCKET) 
      closesocket(m_Socket); 
    } 

    operator SOCKET() { return m_Socket; } 
    bool operator !() { return (m_Socket == INVALID_SOCKET); } 
}; 

int main() 
{ 
    try 
    { 
     std::string fname; 
     std::cout << "Enter Your name: "; 
     std::getline(std::cin, fname); 

     std::string lname; 
     std::cout << "Enter Your Last name: "; 
     std::getline(std::cin, lname); 

     std::string telnum; 
     std::cout << "Enter Your Tel Number: "; 
     std::getline(std::cin, telnum); 

     std::string email; 
     std::cout << "Enter Your Email: "; 
     std::getline(std::cin, email); 

     sWsa wsa; 

     sSocket sckt = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)); 
     if (!sckt) 
      error("Invalid Socket", WSAGetLastError()); 

     sockaddr_in clientService = {0}; 
     clientService.sin_family = AF_INET; 
     clientService.sin_addr.s_addr = inet_addr("127.0.0.1"); 
     clientService.sin_port = htons(80); 

     if (connect(sckt, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR) 
      error("Connection Failure", WSAGetLastError()); 

     std::ostringstream oss_data; 
     oss_data << "fname=" << fname 
      << "&lname=" << lname 
      << "&telnum=" << telnum 
      << "&email=" << email; 
     std::string data = oss_data.str(); 

     std::ostringstream oss_request; 
     oss_request << "POST /server/dbarea.php HTTP/1.1\r\n" 
      << "Content-Type: application/x-www-form-urlencoded\r\n" 
      << "Host: localhost\r\n" 
      << "Content-Length: " << data.size() << "\r\n" 
      << "\r\n" 
      << data; 
     std::string request = oss_request.str(); 

     if (send(sckt, request.c_str(), request.size(), 0) == SOCKET_ERROR) 
      error("Not Sent", WSAGetLastError()); 
    } 
    catch (const std::exception &e) 
    { 
     std::cerr << e.what(); 
     return 1; 
    } 

    MessageBoxA(NULL, "Message Sent", "", MB_OK); 

    return 0; 
} 
+0

strcat (buffer, "Content-Length:% d \ r \ n", strlen (data)); возвращает ошибку слишком много аргументов в вызовах функций. – Manheim

+0

@Manheim Я установил пример. –

+0

Проблема здесь, возможно, с php. Все, что я пробовал, не отправляет данные в текстовый файл. Это код http://pastebin.com/YnArUVDZ – Manheim

Смежные вопросы