2012-04-28 2 views
0

데이터를 "수신"으로 설정 한 경우 "송신"(첫 번째) 또는 "전환" 다른 컴퓨터에서 보낸 "(처음)?"보내기/받기"또는 "받기/보내기"중 하나를 수행하도록 소켓을 설정하는 방법

감사

일반적인 코드 :

-(void) TcpClient{ 
    char buffer[128]; 
    struct sockaddr_in sin; 
    struct hostent *host; 
    int s; 

    host = gethostbyname("10.0.0.3"); 

    memcpy(&(sin.sin_addr), host->h_addr,host->h_length); 
    sin.sin_family = host->h_addrtype; 
    sin.sin_port = htons(4000); 

    s = socket(AF_INET, SOCK_STREAM, 0); 
    connect(s, (struct sockaddr*)&sin, sizeof(sin)); 

    while(1){//this is the Client sequence: 
     send(s, buffer, strlen(buffer), 0);//but what if the Server sends first ?? Client needs to receive here first 
     recv(s, buffer, sizeof(buffer), 0); 
    } 
    close(s); 
} 

답변

2

소켓은 양방향입니다. 언제든지 읽고 쓸 수 있습니다. 읽을 시간과 쓰기 시간을 결정하는 단일 루틴을 작성하려면 select() 기능을 사용해야합니다. 소켓이 읽을 수있는 데이터를 가지고있을 때와 소켓이 보낼 데이터를 받아 들일 수있을 때 알려줍니다. 보낼 데이터가 있기 전에 소켓에서 데이터를 수신하면 루틴이이를 감지하고 "수신/보내기"작업을 수행 할 수 있습니다. 소켓에서 데이터를 받기 전에 보낼 데이터가 있으면 루틴에서이를 감지하고 대신 "보내기/받기"작업을 수행 할 수 있습니다. 예 :

while (1) 
{ 
    fd_set fd; 
    FD_ZERO(&fd); 
    FD_SET(s, &fd); 

    timeval tv; 
    tv.tv_sec = 0; 
    tv.tv_usec = 0; 

    int ret; 

    if (select(s+1, &fd, NULL, NULL, &tv) > 0) 
    { 
     ret = recv(s, buffer, sizeof(buffer), 0); 
     if (ret > 0) 
      send(s, buffer, ret, 0); 
    } 
    else 
    { 
     ret = send(s, buffer, strlen(buffer), 0); 
     if (ret > 0) 
      recv(s, buffer, ret, 0); 
    } 
} 
+0

차단 해제를 설정해야합니까? – jdl

+0

아니요,'select()'는 블로킹 소켓과 비 블로킹 소켓 모두에서 작동합니다. –

1

여러 소켓을 처리하기 위해 select() 시스템 호출을 사용하여 데이터를 읽거나 쓰기 위해 사용할 수있을 때 작업을 트리거 할 수 있습니다. 인터넷에는 일반적으로 소켓 프로그래밍에 대한 정보가 가득합니다. 다른 좋은 정보에 대한 링크가 포함되어있는 here을 시작하십시오.

this one.

그리고 네트워크 프로그래밍에 관한 모든 책에는 좋은 예가 있어야합니다.

관련 문제