为全局变量设置值的 C 函数参数?
C function argument to set values for global variables?
我正在创建可以为函数传递的参数变量声明值的函数。
例如,来自我的 server.c 文件:
int sfd; //socket file descriptor
int listenv; //if listen
struct sockaddr_in serverAddress; //server address
int main(int argc, char * argv[]) { //argv[0] == server //argv[1] == port number
listenv = setServer(argv[1],serverAddress,sfd);
//int port = ntohs(serverAddress.sin_port);
printf("sfd = %d port = %d\n", sfd, ntohs(serverAddress.sin_port));
while (listenv == 0) {
}
}
从我的 serverAPI.h 文件中:
int setServer (char * portn,struct sockaddr_in saddr,int sfd) {
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
saddr.sin_port = (int)htons(atoi(portn));
sfd = socket(AF_INET, SOCK_STREAM, 0);
if (sfd < 0)
error("ERROR opening socket");
printf("Successfully opened socket sfd = %d\n",sfd);
if (bind(sfd, (struct sockaddr *) &saddr, sizeof(saddr)) == -1 )
error("ERROR on binding");
printf("Successfully Binded on port %d\n", ntohs(saddr.sin_port));//show correct port number
int listenv;
if((listenv = listen(sfd,5)) < 0)
error("ERROR on listening");
//print message to show connection has been made
printf("Ready and Listening...");
return (listenv);
}
这就是我的...
而且我预计从 'setServer' 函数中传递的变量(即 ServerAddress 和 sfd)的值应该由函数声明,但它没有...
所以 setServer 函数中的 return 值为:
serverAddress.sin_port = 12345
sfd = 3
listenv = 0
和主要的:
serverAddress.sin_port = 0
sfd = 0
listenv = 0
因为它已被列为全球。
我必须将什么设置为 setServer 的参数,以便它可以为全局变量设置值?
由于C通过按值复制传递参数,当修改sfd
或saddr
时,您只修改参数本身,即,传递的参数的副本。您需要传递指针才能实际修改变量。像这样声明 setServer
:
int setServer (char * portn, struct sockaddr_in* saddr, int* sfd);
添加取消引用运算符:
saddr->sin_family = AF_INET;
saddr->sin_addr.s_addr = htonl(INADDR_ANY);
saddr->sin_port = (int)htons(atoi(portn));
*sfd = socket(AF_INET, SOCK_STREAM, 0);
if (*sfd < 0)
error("ERROR opening socket");
printf("Successfully opened socket sfd = %d\n",*sfd);
if (bind(*sfd, (struct sockaddr *) saddr, sizeof(*saddr)) == -1 )
error("ERROR on binding");
printf("Successfully Binded on port %d\n", ntohs(saddr->sin_port));//show correct port number
int listenv;
if((listenv = listen(*sfd,5)) < 0)
error("ERROR on listening");
//print message to show connection has been made
printf("Ready and Listening...");
return (listenv);
并用 指针调用 setServer
:
listenv = setServer(argv[1],&serverAddress,&sfd);
我正在创建可以为函数传递的参数变量声明值的函数。
例如,来自我的 server.c 文件:
int sfd; //socket file descriptor
int listenv; //if listen
struct sockaddr_in serverAddress; //server address
int main(int argc, char * argv[]) { //argv[0] == server //argv[1] == port number
listenv = setServer(argv[1],serverAddress,sfd);
//int port = ntohs(serverAddress.sin_port);
printf("sfd = %d port = %d\n", sfd, ntohs(serverAddress.sin_port));
while (listenv == 0) {
}
}
从我的 serverAPI.h 文件中:
int setServer (char * portn,struct sockaddr_in saddr,int sfd) {
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
saddr.sin_port = (int)htons(atoi(portn));
sfd = socket(AF_INET, SOCK_STREAM, 0);
if (sfd < 0)
error("ERROR opening socket");
printf("Successfully opened socket sfd = %d\n",sfd);
if (bind(sfd, (struct sockaddr *) &saddr, sizeof(saddr)) == -1 )
error("ERROR on binding");
printf("Successfully Binded on port %d\n", ntohs(saddr.sin_port));//show correct port number
int listenv;
if((listenv = listen(sfd,5)) < 0)
error("ERROR on listening");
//print message to show connection has been made
printf("Ready and Listening...");
return (listenv);
}
这就是我的...
而且我预计从 'setServer' 函数中传递的变量(即 ServerAddress 和 sfd)的值应该由函数声明,但它没有...
所以 setServer 函数中的 return 值为:
serverAddress.sin_port = 12345
sfd = 3
listenv = 0
和主要的:
serverAddress.sin_port = 0
sfd = 0
listenv = 0
因为它已被列为全球。
我必须将什么设置为 setServer 的参数,以便它可以为全局变量设置值?
由于C通过按值复制传递参数,当修改sfd
或saddr
时,您只修改参数本身,即,传递的参数的副本。您需要传递指针才能实际修改变量。像这样声明 setServer
:
int setServer (char * portn, struct sockaddr_in* saddr, int* sfd);
添加取消引用运算符:
saddr->sin_family = AF_INET;
saddr->sin_addr.s_addr = htonl(INADDR_ANY);
saddr->sin_port = (int)htons(atoi(portn));
*sfd = socket(AF_INET, SOCK_STREAM, 0);
if (*sfd < 0)
error("ERROR opening socket");
printf("Successfully opened socket sfd = %d\n",*sfd);
if (bind(*sfd, (struct sockaddr *) saddr, sizeof(*saddr)) == -1 )
error("ERROR on binding");
printf("Successfully Binded on port %d\n", ntohs(saddr->sin_port));//show correct port number
int listenv;
if((listenv = listen(*sfd,5)) < 0)
error("ERROR on listening");
//print message to show connection has been made
printf("Ready and Listening...");
return (listenv);
并用 指针调用 setServer
:
listenv = setServer(argv[1],&serverAddress,&sfd);