Я удалил конкретные части Android
#include <stdio.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int createSocket() {
int sockFD;
if ((sockFD = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("Unable to create socket");
return -1;
}
printf("Socket created: %i", sockFD);
return sockFD;
}
int main() {
struct sockaddr_in server;
int sockFD, new_socket;
char * message;
if ((sockFD = createSocket()) < 0) {
return -1;
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_port = htons(8888);
new_socket = connect(sockFD, (struct sockaddr *)&server, sizeof(server));
printf("Connect return value: %i", new_socket);
int rtn = recv(sockFD, message, sizeof(char), 0);
printf("Message: %i", rtn);
close(sockFD);
return 1;
}
Это работает как ожидалось. Попробуйте сами, подключившись к 127.0.0.1
. Если на хост-компьютере не запущен сервер, он не сможет подключиться (connect вернет -1 и значение errno будет установлено соответствующим образом).
Убедитесь, что IP-адрес, который вы используете для подключения, действительно указывает на ваш сервер.
Также есть проблема в recv:
int rtn = recv(sockFD, message, sizeof(char), 0);
Переменная message
- это указатель, который не был назначен какой-либо памяти (он содержит некоторое значение мусора в стеке), и вы перезаписываете его. См. руководство для recv (2) .
Чтобы исправить это, вы должны либо назначить указатель на некоторую выделенную память:
message = malloc(1); //char is always a single byte
или используйте стек вместо кучи для хранения байта сообщения:
char message;
...
int rtn = recv(sockFD, &message, sizeof(char), 0);
Я предположил, что ваше сообщение всегда состоит из одного байта.
Имейте в виду, что здесь:
printf("Message: %i", rtn);
вы печатаете код возврата, а не реальное сообщение.