在windows下用C语言写了关于socket的程序,用mingw没法编译成功,但是改成C++程序就可以,这是为什么

在windows下用C语言写了关于socket的程序,用mingw无法编译成功,但是改成C++程序就可以,这是为什么
       如题:在windows下用C语言写了关于socket的程序,用mingw无法编译成功(用gcc -o client1 client1.c -lws2_32),但是改成C++程序就可以(也没改程序内容,就是程序后缀是.cpp,用g++命令就可以编译成功),这是为什么?

client程序如下
#include <windows.h>
#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>

#pragma  comment(lib,"ws2_32.lib")


int main(int argc, char* argv[])
{
    WORD sockVersion = MAKEWORD(2,2);
    WSADATA data; 
    if(WSAStartup(sockVersion, &data) != 0)
    {
        return 0;
    }

    SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(sclient == INVALID_SOCKET)
    {
        printf("invalid socket !");
        return 0;
    }

    sockaddr_in serAddr;
    serAddr.sin_family = AF_INET;
    serAddr.sin_port = htons(8888);
    serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 
    if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
    {
        printf("connect error !");
        closesocket(sclient);
        return 0;
    }
    char * sendData = "你好,TCP服务端,我是客户端!\n";
    send(sclient, sendData, strlen(sendData), 0);

    char recData[255];
    int ret = recv(sclient, recData, 255, 0);
    if(ret > 0)
    {
        recData[ret] = 0x00;
        printf(recData);
    }
    closesocket(sclient);
    WSACleanup();
    return 0;
}


怎样修改成C程序能让mingw编译成功
------解决思路----------------------
注意c和c++语法上的细微区别
例如25行 sockaddr_in serAddr;改为
struct sockaddr_in serAddr;

别以为不用类,模板等c++的特性c和c++完全一样,他们语法有区别的,比如c++声明结构体变量时不用加struct,c必须加
另外c里面没有bool,我以前看到过有新手在c里声明bool变量...
------解决思路----------------------
还有35行,c的声明必须放在函数开头