2016-07-14 14 views
0

Я совершенно новичок в программировании сокетов, поэтому любезно, пожалуйста, несите меня. Я пытаюсь подключиться к серверу tcp, который работает в cloud9 из локального machine.Is можно соединить?, если да как?Программирование сокетов TCP в c, где сервер работает в облаке9, и клиент на локальной машине

Server.c

#include<stdio.h> 
#include<string.h> //strlen 
#include<sys/socket.h> 
#include<arpa/inet.h> //inet_addr 
#include<unistd.h> 
int main(int argc , char *argv[]) 
{ 
    int socket_desc , client_sock , c , read_size; 
struct sockaddr_in server , client; 
char client_message[2000]; 

//Create socket 
socket_desc = socket(AF_INET , SOCK_STREAM , 0); 
if (socket_desc == -1) 
{ 
    printf("Could not create socket"); 
} 
puts("Socket created"); 

//Prepare the sockaddr_in structure 
server.sin_family = AF_INET; 
server.sin_addr.s_addr = inet_addr("0.0.0.0"); 
server.sin_port = htons(8080); 

//Bind 
if(bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0) 
{ 
    //print the error message 
    perror("bind failed. Error"); 
    return 1; 
} 
puts("bind done"); 

//Listen 
listen(socket_desc , 3); 

//Accept and incoming connection 
puts("Waiting for incoming connections..."); 
c = sizeof(struct sockaddr_in); 

//accept connection from an incoming client 
client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c); 
if (client_sock < 0) 
{ 
    perror("accept failed"); 
    return 1; 
} 
puts("Connection accepted"); 

//Receive a message from client 
while((read_size = recv(client_sock , client_message , 2000 , 0)) > 0) 
{ 
    //Send the message back to client 
    write(client_sock , client_message , strlen(client_message)); 
} 

if(read_size == 0) 
{ 
    puts("Client disconnected"); 
    fflush(stdout); 
} 
else if(read_size == -1) 
{ 
    perror("recv failed"); 
} 

return 0; 
} 

client.c

#include <stdio.h> 
#include <string.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <netdb.h> 
#include <strings.h> 
int main() 
{ 
int sock,i; 
struct sockaddr_in server; 
char message[100] , server_reply[100]; 
struct hostent *lh = gethostbyname("tcpserver- chaturasan.c9users.io"); 
    *message = '\0'; 
    *server_reply = '\0'; 
    printf("%s %s",message,server_reply); 
//Create socket 
sock = socket(AF_INET , SOCK_STREAM , 0); 
if (sock == -1) 
{ 
    printf("Could not create socket"); 
} 
puts("Socket created"); 
server.sin_addr.s_addr = inet_addr("104.155.229.222"); 
//bcopy (lh->h_addr, &(server.sin_addr.s_addr), lh->h_length); 
server.sin_family = AF_INET; 
server.sin_port = htons(8080); 

//Connect to remote server 
if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0) 
{ 
    perror("connect failed. Error"); 
    return 1; 
} 

puts("Connected\n"); 

//keep communicating with server 
while(1) 
{ 
    printf("Enter message : "); 
    message[100]='\0'; 
    scanf("%s" , message); 

    //Send some data 
    if(send(sock , message , strlen(message) , 0) < 0) 
    { 
     puts("Send failed"); 
     return 1; 
    } 

    //Receive a reply from the server 
    if(recv(sock , server_reply , 2000 , 0) < 0) 
    { 
     puts("recv failed"); 
     break; 
    } 

    puts("Server reply :"); 
    printf("%s",server_reply); 
    server_reply[100]='\0'; 
} 

close(sock); 
return 0; 
} 

Выходной сервер, как этот выход клиента

Socket created 
bind done 
Waiting for incoming connections... 

является

Socket created 
Connected 
Enter message : 

Показывает, что клиент подключен, но сервер не показывает соединений

+0

Было ли сообщение об ошибке? И если да, то (а) что? и (б) почему это было исключено из вопроса? – EJP

+0

выхода клиентской программы, как этот сокет, созданный Connected Введите сообщение: Сервер Ouput: сокет создан привязка осуществляется Ожидания входящих соединений ...... он показывает клиент подключен, но сервер не показывает никаких связей – Chaturasan

+0

Если вы печатаете что-то в клиент распечатывается? – immibis

ответ

1

Telnet ваш сервер на 104.155.229.222, порт 8080. Если вы можете подключиться, то ваш сервер должен вывести «Connection accepted» (не в вашем приглашении telnet, но где бы вы ни были серверные сообщения появляются). По крайней мере, вы узнаете, что ваш сервер прослушивает адрес/порт, который вы планируете использовать. Если вы можете conenct, но не видите сообщение «Connection accepted», есть вероятность, что вы подключаетесь к другому серверу.

+0

Спасибо за ответ, похоже, что я подключен к другому серверу. Как я могу подключиться к моему серверу? – Chaturasan

+0

Это сложнее ответить; номера портов кажутся правильными (они одинаковы как на клиенте, так и на сервере). Я бы сказал, чтобы сначала проверить свой IP-адрес, чтобы убедиться, что вы достигли нужного хоста. –

+1

Извините за поздний ответ, без http-серверов невозможно получить доступ с помощью tcpserver- chaturasan.c9users.io в cloud9 – Chaturasan