Функция не возвращается к вызывающей стороне после использования socket () - PullRequest
0 голосов
/ 21 апреля 2019

Как показано в моем следующем коде.У меня есть функция для создания сокета в моем серверном приложении.Мой код компилируется нормально и все;однако функция (с именем 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 в качестве аргумента моей программе.Результаты, только "Уильям" распечатан на консоли, и затем я продолжаю ждать (программа все еще работает).

1 Ответ

0 голосов
/ 21 апреля 2019

Результаты, только "Уильям" распечатан на консоли

просто замените

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

от

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

или

puts("create socket function done");

очистить вывод благодаря новой строке

Конечно, это предполагает, что вы достигнете printf , что означает bindSocketToPort и startListenAndAccept и recvAndSend return

передача 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...