使用 socket() 后函数不返回调用者
Function not returning to caller after using socket()
如我下面的代码所示。我有一个在我的服务器应用程序中创建套接字的功能。我的代码编译得很好;但是,函数(名为 createSocket)不会完成。因此,当我 运行 我的程序时,我的程序一直在等待。我知道这是因为,fprinf 函数是我的 createSocket 函数之后的下一条语句,它永远不会打印出来。
我添加了一个 printf 语句作为我的 createSocket 函数的最后一个语句。它确实打印!但它不会 return 给调用者(这是主要的)。
struct addrinfo serverInfo, *pToResult;
struct sockaddr_storage client_addr;
int serverfd, connectfd;
void createSocket(char**);
void bindSocketToPort(void);
void startListenAndAccept(void);
void recvAndSend(void);
int main(int argc, char *argv[])
{
createSocket(argv);
fprintf(stdout, "create socket function done");
bindSocketToPort();
startListenAndAccept();
recvAndSend();
return 0;
}
#define serv pToResult
void createSocket(char** argv)
{
memset(&serverInfo, 0, sizeof serverInfo);
serverInfo.ai_family = PF_INET;
serverInfo.ai_socktype = SOCK_STREAM;
if(getaddrinfo("127.0.0.1", argv[1], &serverInfo, &serv) != 0)
{
perror("getaddrinfo error");
exit(1);
}
if( (serverfd = socket(serv->ai_family, serv->ai_socktype, serv->ai_protocol) ) == -1)
{
perror("socket error");
exit(1);
}
puts("william");
return;
}
用 gcc 编译后,将 65000 作为参数传入我的程序。结果,控制台只打印了"william",然后一直等着(程序还在运行ning)。
The results are, only "william" printed out on the console
只是替换
fprintf(stdout, "create socket function done");
来自
fprintf(stdout, "create socket function done\n");
或
puts("create socket function done");
刷新输出感谢换行符
当然,假设你达到 printf,这意味着 bindSocketToPort 和 startListenAndAccept 和recvAndSend return
passing in 65000 as an argument to my program
注意你没有使用参数
定义 bindSocketToPort 和 startListenAndAccept 和 recvAndSend 的示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
struct addrinfo serverInfo, *pToResult;
struct sockaddr_storage client_addr;
int serverfd, connectfd;
void createSocket(char**);
void bindSocketToPort(void) {}
void startListenAndAccept(void){}
void recvAndSend(void){}
int main(int argc, char *argv[])
{
createSocket(argv);
fprintf(stdout, "create socket function done\n");
bindSocketToPort();
startListenAndAccept();
recvAndSend();
return 0;
}
#define serv pToResult
void createSocket(char** argv)
{
memset(&serverInfo, 0, sizeof serverInfo);
serverInfo.ai_family = PF_INET;
serverInfo.ai_socktype = SOCK_STREAM;
if(getaddrinfo("127.0.0.1", argv[1], &serverInfo, &serv) != 0)
{
perror("getaddrinfo error");
exit(1);
}
if( (serverfd = socket(serv->ai_family, serv->ai_socktype, serv->ai_protocol) ) == -1)
{
perror("socket error");
exit(1);
}
puts("william");
return;
}
编译执行
pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra s.c
s.c: In function ‘main’:
s.c:17:14: warning: unused parameter ‘argc’ [-Wunused-parameter]
int main(int argc, char *argv[])
^~~~
pi@raspberrypi:/tmp $ ./a.out
william
create socket function done
如我下面的代码所示。我有一个在我的服务器应用程序中创建套接字的功能。我的代码编译得很好;但是,函数(名为 createSocket)不会完成。因此,当我 运行 我的程序时,我的程序一直在等待。我知道这是因为,fprinf 函数是我的 createSocket 函数之后的下一条语句,它永远不会打印出来。
我添加了一个 printf 语句作为我的 createSocket 函数的最后一个语句。它确实打印!但它不会 return 给调用者(这是主要的)。
struct addrinfo serverInfo, *pToResult;
struct sockaddr_storage client_addr;
int serverfd, connectfd;
void createSocket(char**);
void bindSocketToPort(void);
void startListenAndAccept(void);
void recvAndSend(void);
int main(int argc, char *argv[])
{
createSocket(argv);
fprintf(stdout, "create socket function done");
bindSocketToPort();
startListenAndAccept();
recvAndSend();
return 0;
}
#define serv pToResult
void createSocket(char** argv)
{
memset(&serverInfo, 0, sizeof serverInfo);
serverInfo.ai_family = PF_INET;
serverInfo.ai_socktype = SOCK_STREAM;
if(getaddrinfo("127.0.0.1", argv[1], &serverInfo, &serv) != 0)
{
perror("getaddrinfo error");
exit(1);
}
if( (serverfd = socket(serv->ai_family, serv->ai_socktype, serv->ai_protocol) ) == -1)
{
perror("socket error");
exit(1);
}
puts("william");
return;
}
用 gcc 编译后,将 65000 作为参数传入我的程序。结果,控制台只打印了"william",然后一直等着(程序还在运行ning)。
The results are, only "william" printed out on the console
只是替换
fprintf(stdout, "create socket function done");
来自
fprintf(stdout, "create socket function done\n");
或
puts("create socket function done");
刷新输出感谢换行符
当然,假设你达到 printf,这意味着 bindSocketToPort 和 startListenAndAccept 和recvAndSend return
passing in 65000 as an argument to my program
注意你没有使用参数
定义 bindSocketToPort 和 startListenAndAccept 和 recvAndSend 的示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
struct addrinfo serverInfo, *pToResult;
struct sockaddr_storage client_addr;
int serverfd, connectfd;
void createSocket(char**);
void bindSocketToPort(void) {}
void startListenAndAccept(void){}
void recvAndSend(void){}
int main(int argc, char *argv[])
{
createSocket(argv);
fprintf(stdout, "create socket function done\n");
bindSocketToPort();
startListenAndAccept();
recvAndSend();
return 0;
}
#define serv pToResult
void createSocket(char** argv)
{
memset(&serverInfo, 0, sizeof serverInfo);
serverInfo.ai_family = PF_INET;
serverInfo.ai_socktype = SOCK_STREAM;
if(getaddrinfo("127.0.0.1", argv[1], &serverInfo, &serv) != 0)
{
perror("getaddrinfo error");
exit(1);
}
if( (serverfd = socket(serv->ai_family, serv->ai_socktype, serv->ai_protocol) ) == -1)
{
perror("socket error");
exit(1);
}
puts("william");
return;
}
编译执行
pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra s.c
s.c: In function ‘main’:
s.c:17:14: warning: unused parameter ‘argc’ [-Wunused-parameter]
int main(int argc, char *argv[])
^~~~
pi@raspberrypi:/tmp $ ./a.out
william
create socket function done