2013-05-28 2 views
1

C에서 루프백 소켓을 설정하려고하지만 아무 것도 작동하지 않습니다. 내가 루프백 주소 소켓을 열고 소켓 및 다른 함수에서 데이터를 읽는 함수를 만들려고 노력하고 있지만 아무것도 작동합니다. 연결과 관련된 기능을 사용하는 방법을 모르겠습니다. 여기에 지금까지 수행 할 것입니다 : 요컨대INADDR_LOOPBACK을 사용하는 루프백 예제가 작동하지 않습니다.

#include <sys/wait.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <netdb.h>   
#include <unistd.h>    
#include <stdlib.h>   
#include <ctype.h>   
#include <signal.h>   
#include <iostream> 
#include <cerrno> 
#include <pthread.h> 

int internal_s; 

void function1(){ 
    if ((internal_s = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
     perror_exit("socket"); 

    /* Find server address */ 
    struct sockaddr_in loopback; 
    struct sockaddr *serverptr = (struct sockaddr*)&loopback; 

    /*Convert port number to integer*/   
    loopback.sin_family = AF_INET;  /* Internet domain */ 
    loopback.sin_addr.s_addr=htonl(INADDR_LOOPBACK); 
    loopback.sin_port=htons(10000); 

    /* Initiate connection */ 
    if (bind(internal_s,serverptr, sizeof(loopback))<0) 
     perro("bind"); 

    int test=1; 
    err=write(internal_s,&test,sizeof(int)); 
    if(err<0) 
     perror(write); 
} 

void Open_Internal_sock(int socket_s){ 
    struct sockaddr_in loopback; 
    struct sockaddr *serverptr = (struct sockaddr*)&loopback; 

    /*Convert port number to integer*/   
    loopback.sin_family = AF_INET;  /* Internet domain */ 
    loopback.sin_addr.s_addr=htonl(INADDR_LOOPBACK); 
    loopback.sin_port=htons(10000); 

    /* Initiate connection */ 
    if (bind(socket_s,serverptr, sizeof(loopback))<0) 
     perror("bind");//Invalid argument 
    int test; 
    if(read(socket_s,&test,sizeof(int))<0) 
     perror("read");//herer it prints:Transport endpoint is not connected 
} 

int main(){ 
    function1(i); 
    Open_Internal_sock(internal_s); 
} 
+0

I/O에 연결하거나 수락하지 않는 한 I/O 용 소켓을 사용할 수 없습니다. 당신의 코드는 의미가 없습니다. 루프백은 아무 관계가 없습니다. 진짜 질문이 아닙니다. – EJP

+0

스택 오버플로에 대한 [소켓 프로그래밍을위한 INADDR_ANY 이해] (https://stackoverflow.com/q/16508685/608639)를 참조하십시오. – jww

답변

4

, 클라이언트 (보낸 사람, "작가")는 connect()를 호출해야하고 서버 (수신기, 수신기, "독자") listen()accept() 살았어 필요가있다.

서버 작업과 클라이언트 작업도 별도의 스레드 실행이 필요합니다. 일부 소켓 작업이 차단되어 단일 스레드 실행이 영구 중단되기 때문입니다. 아마도 가장 쉬운 방법은 server.c와 client.c를 별도의 프로그램으로 만드는 것입니다.

또한 gcc -Wall과 같이 경고가 설정된 코드를 컴파일 해보십시오. 이제 컴파일러가 여러분에게 지적 할 수있는 많은 오류가 있습니다. 명확한 메시지를 얻으려면 gcc 대신 clang을 컴파일러로 사용해보십시오.

나는 http://kohala.com/start/unpv12e/unpv12e.tar.gz을 제안합니다. tar xzvf unpv12e.tar.gz으로 풀고 unpv12e/tcpcliserv/tcpcli01.c 및 unpv12e/tcpcliserv/tcpserv01.c를보십시오. & 붙여 넣기를 복사하려면 영구 문자없이 코드가 작동하려면 대문자 (예 : Listen())를 소문자로 변경해야합니다. 이 변경은 또한 모든 오류 검사를 제거하므로 사용자 자신의 오류 처리에 넣어야합니다.

+0

스레딩을 사용할 필요가 없습니다. select()/poll() 등을 사용하고 단일 서버 모델을 사용할 수도 있습니다. – Devolus