2016-04-10 2 views
-1

Я пытаюсь имитировать запрос Winsock, он не отправляет данные, поскольку он просто отправляет пустые данные, файл (текстовый файл) создается, но, к сожалению, я не вижу никаких данных в текстовый файл.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 name: \n"); 
    scanf("%31s",lname); 

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

    char email[32]; 
    printf("Enter Your name: \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 /dbarea.php HTTP/1.1\n"); 
    strcat(buffer,"Content - Type:application/x-www-form-urlencoded\n"); 
    strcat(buffer,"Host: localost\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(s, 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

Вы пытались отладить свой код, чтобы шаг за шагом, чтобы увидеть, как все работает так, как должно, и что все переменные имеют значения, которые вы ожидаете от них? –

+0

@JoachimPileborg, да, у меня есть сэр, и он просто не отправляет его – Manheim

+0

Почему, по-вашему, Winsock отправляет пустые данные? Многие данные в переменной '$ log' жестко закодированы, поэтому, если вы получаете полностью пустой файл, есть проблема с вашим кодом PHP. – Chris

ответ

0

Следующие строки приводят к непредсказуемому поведению:

char* fname, lname, telnum,email; 
printf("Enter Your name: \n"); 
scanf("%s",&fname); 
printf("Enter Your Last Name: \n"); 
scanf("%s",&lname); 
printf("Enter Your Telephone: \n"); 
scanf("%s",&telnum); 
printf("Enter Your EMail: \n"); 
scanf("%s",&email); 

Сначала вы дону инициализировать переменные указателя, поэтому их значения будут неопределенными и использовать их любым способом, кроме инициализации, это не определено поведение.

Вторая проблема связана с вашими звонками scanf. Это правда, что scanf ожидает указатель, но эти переменные - это уже указатели, поэтому с помощью адреса оператора вы получите указатель на указатель, который в этом случае имеет тип char **.

Решение состоит в использовании массивов, например,

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

Я отредактировал сейчас, когда он показывает ошибку в области отправки, чтобы отправить данные, которая выглядит так: if (! Send (s, buffer, strlen (buffer), 0)) Не правильно ли я назвал Конвенцию? – Manheim

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