2016-10-28 3 views
-1

하나의 클라이언트와 서버 사이에 소켓 연결을 설정하여 간단한 채팅 응용 프로그램을 만들고 있습니다. 동일한 컴퓨터에있는 두 개의 다른 터미널에서 클라이언트와 서버를 실행할 수 있습니다. 이제 어떻게 두 대의 컴퓨터에서 클라이언트와 서버를 실행할 수 있습니까? 서버 프로그램에서 localhost "127.0.0.1"대신 서버 컴퓨터의 IP 주소를 사용하려고했습니다. 그것은 작동하지 않았다.C의 클라이언트 서버 채팅 응용 프로그램

누군가가이 기능을 구현하는 방법을 알려 줄 수 있습니까? 또한 IP 주소와 포트 번호를 어떻게 동적으로 전달할 수 있습니까?

TCP 클라이언트

#include<sys/socket.h> 
#include<stdio.h> 
#include<string.h> 
#include<netdb.h> 
#include<stdlib.h> 

int main() 
{ 
    char buf[100]; 
    int k; 
    int sock_desc; 
    struct sockaddr_in client; 
    memset(&client,0,sizeof(client)); 
    sock_desc=socket(AF_INET,SOCK_STREAM,0); 

    if(sock_desc==-1) 
    { 
     printf("Error in socket creation"); 
     exit(1); 
    } 

    client.sin_family=AF_INET; 
    client.sin_addr.s_addr=INADDR_ANY; 
    client.sin_port=3002; 

    k=connect(sock_desc,(struct sockaddr*)&client,sizeof(client)); 
    if(k==-1) 
    { 
     printf("Error in connecting to server"); 
     exit(1); 
    } 

    while(1) 
    { 
     printf("\nEnter data to be send to server: "); 
     fgets(buf,100,stdin); 
     if(strncmp(buf,"end",3)==0) 
      break; 

     k=send(sock_desc,buf,100,0); 
     if(k==-1) 
     { 
      printf("Error in sending"); 
      exit(1); 
     } 

     k=recv(sock_desc,buf,100,0); 
     if(k==-1) 
     { 
      printf("Error in receiving"); 
      exit(1); 
     } 

     printf("Message got from server is : %s",buf); 
    } 
    close(sock_desc); 
    exit(0); 
    return 0; 
} 

TCP 서버

#include<sys/socket.h> 
#include<stdio.h> 
#include<string.h> 
#include<netdb.h> 
#include<stdlib.h> 
int main() 
{ 
    char buf[100]; 
    int k; 
    socklen_t len; 
    int sock_desc,temp_sock_desc; 
    struct sockaddr_in server,client; 

    memset(&server,0,sizeof(server)); 
    memset(&client,0,sizeof(client)); 

    sock_desc=socket(AF_INET,SOCK_STREAM,0); 
    if(sock_desc==-1) 
    { 
     printf("Error in socket creation"); 
     exit(1); 
    } 

    server.sin_family=AF_INET; 
    server.sin_addr.s_addr=inet_addr("127.0.0.1"); 
    server.sin_port=3002; 

    k=bind(sock_desc,(struct sockaddr*)&server,sizeof(server)); 
    if(k==-1) 
    { 
     printf("Error in binding"); 
     exit(1); 
    } 

    k=listen(sock_desc,20); 
    if(k==-1) 
    { 
     printf("Error in listening"); 
     exit(1); 
    } 

    len=sizeof(client);//VERY IMPORTANT 
    temp_sock_desc=accept(sock_desc,(struct sockaddr*)&client,&len); 
    if(temp_sock_desc==-1) 
    { 
     printf("Error in temporary socket creation"); 
     exit(1); 
    } 

    while(1) 
    { 
     k=recv(temp_sock_desc,buf,100,0); 
     if(k==-1) 
     { 
      printf("Error in receiving"); 
      exit(1); 
     } 

     printf("Message got from client is : %s",buf); 
     printf("\nEnter data to be send to client: "); 

     fgets(buf,100,stdin); 
     if(strncmp(buf,"end",3)==0) 
      break; 

     k=send(temp_sock_desc,buf,100,0); 
     if(k==-1) 
     { 
      printf("Error in sending"); 
      exit(1); 
     } 
    } 
    close(temp_sock_desc); 

    exit(0); 
    return 0; 
} 
+1

'main'에 인수로 IP와 포트를 전달할 수 있습니다. 프로그램은 명령 줄 인수로 IP와 포트를 가져야합니다. – Prabhu

+0

코드를 올바르게 들여 썼다면 훨씬 더 읽기 쉬울 것입니다. – alk

+0

텔넷 또는 다른 네트워크 프로그램이 두 컴퓨터간에 작동하는지 테스트 할 수 있습니다. 일부 방화벽이 두 컴퓨터 간의 통신을 차단할 수 있습니다. – kjohri

답변

0

당신은 역에서 클라이언트를 sockaddr_in 및 서버를 sockaddr_in 있습니다. 클라이언트를 sockaddr_in 구조가 있어야한다 :

client.sin_family=AF_INET; 
client.sin_addr.s_addr=inet_addr("add server ip here"); 
client.sin_port=3002; 

그리고 서버를 sockaddr_in 구조가 있어야한다 :

server.sin_family=AF_INET; 
server.sin_addr.s_addr=INADDR_ANY; 
server.sin_port=3002; 

은 지금 당신의 서버는 루프백에 결합하여 클라이언트는 INADDR_ANY에 연결합니다.

관련 문제