C:创建一个全局套接字并从不同的.C文件调用

C:创建一个全局套接字并从不同的.C文件调用,c,sockets,global,C,Sockets,Global,我正在使用VS2010。是否可以使套接字成为全局的,这样我就可以从同一项目中的所有.c文件调用此套接字?有可能的话,怎么办?如果不可能,为什么不呢?以下是我的代码: 全局是我创建全局套接字的地方。我在main.c和send.c中使用它 全球 extern SOCKET s; typedef struct { int x; double y; char z[32]; }Person; main.c #include "stdafx.h" #include "send.f"

我正在使用VS2010。是否可以使套接字成为全局的,这样我就可以从同一项目中的所有.c文件调用此套接字?有可能的话,怎么办?如果不可能,为什么不呢?以下是我的代码:

全局是我创建全局套接字的地方。我在main.c和send.c中使用它

全球

extern SOCKET s;
typedef struct
{
    int x;
    double y;
    char z[32];
}Person;
main.c

#include "stdafx.h"
#include "send.f"

SOCKET s;

void printPerson(Person *p)
{
    printf("p.x: %d\n", p->x);
    printf("p.y: %f\n", p->y);
    printf("p.z: %s\n", p->z);
}

void establishConnection()
{
    //extern SOCKET s;
    struct sockaddr_in server;
    //struct addrinfo hints;
    //char *message, server_reply[2000];
    //int recv_size;

    if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d", WSAGetLastError());
    }

    server.sin_addr.s_addr = inet_addr("127.0.0.1");
    server.sin_family = AF_INET;
    server.sin_port = htons(200);

    if(connect(s, (struct sockaddr *)&server, sizeof(server)) < 0)
    {
        puts("Connect error");
        Sleep(1000);
        puts("Retrying");
        establishConnection();
    }
    else
        puts("Server Connected\n");
}



int main()
{
    char *name;
    int a;

    WSADATA wsa;
    puts("\nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
    {
        printf("Failed. Error Code : %d", WSAGetLastError());
        return 1;
    }

    puts("Initialized.");

    establishConnection();

    {
        Person p1;
        recieveData(&p1);
        printPerson(&p1);
        printf("\n");
    }

    {
        Person p2;
        p2.x = 22;
        p2.y = 2.2;
        name = "C Plus Plus";
        strcpy(p2.z, name);
        printPerson(&p2);
        sendData(&p2);
    }

    scanf("%d", &a);
    return 0;
}
发送

#include "stdafx.h"

void recieveData(Person* p)
{
    //extern SOCKET s;
    char bufLen[8];
    int length, XX;
    double YY;
    char *msg, *token;
    char *ZZ;

    if(recv(s, bufLen, 8, 0) < 0)
    {
        puts("Receive failed");
        return;
    }
    length = atoi(bufLen);
    msg = malloc(length + 1);
    memset(msg, 0, length + 1);
    if (recv(s, msg, length, 0) < 0)
    {
        puts("Receive failed");
        return;
    }
    printf("Before first token: %s\n", msg);

    token = strtok(msg, ";");
    printf("After first token: %s\n", token);
    XX = atoi(token);
    printf("XX: %d\n", XX);
    p->x = atoi(token);

    token = strtok(NULL, ";");
    printf("After second token: %s\n", token);
    YY = atof(token);
    printf("YY: %f\n", YY);
    p->y = atof(token);

    token = strtok(NULL, ";");
    printf("After third token: %s\n", token);
    ZZ = malloc(strlen(token));
    memset(ZZ, 0, 32);
    strcpy(ZZ, token);
    printf("ZZ: %s\n", ZZ);

    memset(p->z, 0, 32);
    strcpy(p->z, token);

    free(msg);
    puts("Received!");
}
void sendData(Person* p)
{
    //extern SOCKET s;
    char msg[2000], clen[9];
    int len;

    //char *msg;
    //msg = malloc(2000);

    sprintf(msg, "%d;%f;%s", p->x, p->y, p->z);
    len = strlen(msg);
    sprintf(clen, "%08d", len);
    if (send(s, clen, 8, 0) < 0)
    {
        puts("Send failed");
        return;
    }
    if (send(s, msg, len, 0) < 0)
    {
        puts("Send failed");
        return;
    }
    puts("Sent!\n");
}
#包括“stdafx.h”
无效接收数据(人*p)
{
//外接插座;
char bufLen[8];
整数长度,XX;
双YY;
char*msg,*token;
char*ZZ;
if(recv(s,bufLen,8,0)<0)
{
看跌期权(“接收失败”);
返回;
}
长度=原子(bufLen);
msg=malloc(长度+1);
memset(msg,0,长度+1);
if(recv(s,msg,length,0)<0)
{
看跌期权(“接收失败”);
返回;
}
printf(“在第一个令牌之前:%s\n”,msg);
令牌=strtok(msg,“;”);
printf(“在第一个令牌之后:%s\n”,令牌);
XX=atoi(令牌);
printf(“XX:%d\n”,XX);
p->x=atoi(令牌);
令牌=strtok(空,“;”);
printf(“在第二个令牌之后:%s\n”,令牌);
YY=atof(令牌);
printf(“YY:%f\n”,YY);
p->y=atof(令牌);
令牌=strtok(空,“;”);
printf(“在第三个令牌之后:%s\n”,令牌);
ZZ=malloc(strlen(令牌));
memset(ZZ,0,32);
strcpy(ZZ,令牌);
printf(“ZZ:%s\n”,ZZ);
memset(p->z,0,32);
strcpy(p->z,令牌);
免费(味精);
放置(“已接收!”);
}
无效发送数据(个人*p)
{
//外接插座;
char-msg[2000],clen[9];
内伦;
//char*msg;
//msg=malloc(2000);
sprintf(msg,“%d;%f;%s”,p->x,p->y,p->z);
len=strlen(msg);
斯普林特(克莱恩,“%08d”,蓝);
如果(发送(s,clen,8,0)<0)
{
看跌期权(“发送失败”);
返回;
}
如果(发送(s、msg、len、0)<0)
{
看跌期权(“发送失败”);
返回;
}
放入(“已发送!\n”);
}
stdafx.h

#pragma once
#include <tchar.h>
#include "global.h"

#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib") //Winsock Library
#pragma一次
#包括
#包括“global.h”
#包括
#包括
#包括
#pragma注释(lib,“ws2_32.lib”)//Winsock库

您的
global.h
正在尝试使用未声明的
套接字。您在
global.h
中缺少一个
#include
(可能是
)您的
global.h
正在尝试使用
套接字,此时未声明该套接字。您在
global.h

中缺少一个
#include
(可能是
)您知道如何使用全局变量吗?然后,您已经知道如何使套接字全球化。我并不建议将套接字(或任何真正的)设置为全局的,通常最好将套接字(或其他变量)作为参数传递给需要它的函数。我确实将其设置为全局的,但它显示“error C2061:syntax error:identifier s”。当我宣布为s时;所以你的问题不是你是否可以创建一个全局变量,而是为什么会出现构建错误。然后我建议您将完整的错误复制粘贴到问题正文中,并附上一个。什么是
send.f
?还是说
send.c
?为什么要包括源文件?为什么不将它单独构建到一个对象文件中,并与
main.c
中的对象文件链接?包含
send.c
可能会有问题,因为它试图同时包含
stdafx.h
,我认为VC不允许这样做(如果使用预编译头)。send.f包含send.c中的函数,如下所示。无效发送数据(人*);无效接收数据(人*);你知道如何使用全局变量吗?然后,您已经知道如何使套接字全球化。我并不建议将套接字(或任何真正的)设置为全局的,通常最好将套接字(或其他变量)作为参数传递给需要它的函数。我确实将其设置为全局的,但它显示“error C2061:syntax error:identifier s”。当我宣布为s时;所以你的问题不是你是否可以创建一个全局变量,而是为什么会出现构建错误。然后我建议您将完整的错误复制粘贴到问题正文中,并附上一个。什么是
send.f
?还是说
send.c
?为什么要包括源文件?为什么不将它单独构建到一个对象文件中,并与
main.c
中的对象文件链接?包含
send.c
可能会有问题,因为它试图同时包含
stdafx.h
,我认为VC不允许这样做(如果使用预编译头)。send.f包含send.c中的函数,如下所示。无效发送数据(人*);无效接收数据(人*);
#pragma once
#include <tchar.h>
#include "global.h"

#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib") //Winsock Library