使用socket()后函数未返回调用者

时间:2019-04-21 09:03:32

标签: c sockets server client

如下面的代码所示。我具有在服务器应用程序中创建套接字的功能。我的代码可以正常编译。但是,该函数(名为createSocket)将无法完成。因此,当我运行程序时,我的程序将永远等待。我知道这是因为,fprinf函数(在我的createSocket函数之后的下一条语句中)永远不会打印出来。

我添加了一个printf语句作为我的createSocket函数的最后一条语句。它确实可以打印!但是它不会返回给调用者(主要是)。

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”打印在控制台上,然后我一直在等待(程序仍在运行)。

1 个答案:

答案 0 :(得分:0)

  

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

只需替换

fprintf(stdout, "create socket function done");

作者

fprintf(stdout, "create socket function done\n");

puts("create socket function done");

刷新输出,感谢换行符

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

  

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

请注意,您不要使用参数


使用空主体定义 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