C:创建一个全局套接字并从不同的.C文件调用
我正在使用VS2010。是否可以使套接字成为全局的,这样我就可以从同一项目中的所有.c文件调用此套接字?有可能的话,怎么办?如果不可能,为什么不呢?以下是我的代码: 全局是我创建全局套接字的地方。我在main.c和send.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"
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