2016-07-14 9 views
0

저는 솔직히 소켓 프로그래밍에 익숙해 져서 저와 함께하시기 바랍니다. 로컬에서 cloud9에서 실행되는 TCP 서버에 연결하려고합니다. 연결이 가능합니까? 그렇다면 어떻게해야합니까?c에서 TCP 소켓 프로그래밍은 서버가 cloud9와 로컬 머신의 클라이언트에서 실행 중입니다

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

오류 메시지가 있습니까? 그리고 그렇다면, (a) 무엇? (b) 질문에서 왜 생략 되었습니까? 클라이언트 프로그램의 – EJP

+0

출력 메시지를 입력 을 연결 생성이 소켓과 같다 : 서버 출력 상 : 소켓 생성 바인드 들어오는 연결을 대기 일을 ...... 그것은 보여줍니다 클라이언트 연결하지만 당신은 뭔가를 입력하면 서버가 더 연결을 – Chaturasan

+0

를 보여줍니다 클라이언트가 인쇄물을 다시 받으나요? – immibis

답변

1

텔넷 104.155.229.222에서 서버, 포트 8080 연결할 수있는 경우에, 서버가 출력되지 텔넷 프롬프트에서하지만 어디 ("연결 가능"해야 당신의 서버 메시지가 표시됨). 적어도 서버가 의도 한 주소/포트에서 수신 대기한다는 것을 알 수 있습니다. 연결을 허용 할 수 있지만 "연결 허용됨"메시지가 표시되지 않으면 다른 서버에 연결할 가능성이 있습니다.

+0

답변 해 주셔서 감사합니다. 다른 서버에 연결되어있는 것 같습니다. 내 서버에 어떻게 연결할 수 있습니까? – Chaturasan

+0

대답하기가 더 어렵습니다. 귀하의 포트 번호가 맞을 것입니다 (그들은 클라이언트와 서버 모두 동일합니다). 우선 IP 주소를 확인하여 올바른 호스트에 도달했는지 확인하십시오. –

+1

답장을 보내 드려 죄송합니다. cloud9에서 tcpserver- chaturasan.c9users.io를 사용하여 비 http 서버에 액세스 할 수 없습니다. – Chaturasan