Winsock отправляет пустые данные

Я пытаюсь смоделировать запрос Winsock, он не отправляет данные, а просто отправляет пустые данные, файл (текстовый файл) создает, но, к сожалению, я не вижу никаких данных в текстовом файле.

C++ выглядит так:

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

1 ответ

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

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 ожидает указатель, но эти переменные уже являются указателями, поэтому использование оператора address-of даст вам указатель на указатель, который в данном случае имеет тип char **,

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

char fname[32];
printf("Enter Your name: \n");
scanf("%31s",fname);
Другие вопросы по тегам