Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 函数在使用套接字()后不返回调用方_C_Sockets_Server_Client - Fatal编程技术网

C 函数在使用套接字()后不返回调用方

C 函数在使用套接字()后不返回调用方,c,sockets,server,client,C,Sockets,Server,Client,如我下面的代码所示。我有一个在服务器应用程序中创建套接字的函数。我的代码编译得很好;但是,函数(名为createSocket)将不会完成。因此,当我运行我的程序时,我的程序一直在等待。我之所以知道这一点,是因为在我的createSocket函数之后的下一个语句fprinf函数从未打印出来 我已经添加了一条printf语句作为createSocket函数的最后一条语句。而且它可以打印!但是它不会返回给调用者(这是main) 使用gcc编译后,将65000作为参数传递给我的程序。结果是,控制台上只打

如我下面的代码所示。我有一个在服务器应用程序中创建套接字的函数。我的代码编译得很好;但是,函数(名为createSocket)将不会完成。因此,当我运行我的程序时,我的程序一直在等待。我之所以知道这一点,是因为在我的createSocket函数之后的下一个语句fprinf函数从未打印出来

我已经添加了一条printf语句作为createSocket函数的最后一条语句。而且它可以打印!但是它不会返回给调用者(这是main)

使用gcc编译后,将65000作为参数传递给我的程序。结果是,控制台上只打印“william”,然后我一直在等待(程序仍在运行)

结果是,控制台上只打印“william”

替换

要刷新输出,请使用换行符

当然,这假设您达到了printf,这意味着bindSocketToPort和startListendAccept和recvAndSend返回

将65000作为参数传递给我的程序

注意:您不使用参数


使用空正文定义bindSocketToPort和StartListendAccept和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;
}

请给我一个合适的。什么是
serverInfo
serv
?是否破坏了堆栈或其他内容?serverInfo包含有关我的服务器的信息,类型为struct addrinfo@AnttiHaapalaserv是指向serverInfo的指针@Anttihaapala在打印语句的字符串末尾追加一个
\n
字符。这将迫使输出更可靠地刷新到屏幕。我的灵力表明你的代码比你想象的要快得多-但是标准输出被缓冲了。我只是对我的打印语句感兴趣。它所做的只是换了一条新的生产线@选择fprinf(stdout,“创建套接字函数完成”);我的程序中的语句甚至没有打印出来。我只有“william”作为输出@bruno@user7529140您是否添加了“\n”?@user7529140在调试器中启动您的程序以检查bindSocketToPort和StartListendAccept和recvAndSend returnohh等一下,我想我得到了一些东西@布鲁努姆非常感谢你!它有效!!!!你能给我解释一下冲洗输出意味着什么吗@布鲁诺
fprintf(stdout, "create socket function done");
fprintf(stdout, "create socket function done\n");
puts("create socket function done");
#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