2016-04-10 42 views
0

我試圖讓這段代碼發送數據到一個php文件,而不是它發送,它只是直截了當地返回連接失敗,沒有一個清楚的理解爲什麼,但一切似乎對我來說很好Winsock不發送,顯示連接失敗

#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

您可能會被W​​indows防火牆阻止。你可以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(「Connection Failure。Error code:%d」,WSAGetLastError());''替換''printf(「Connection Failure」);''然後查看[connect()documentation] ://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