2012-04-28 266 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 2012-04-28 00:23:10

+0

不,'select()'適用於阻塞和非阻塞套接字。 – 2012-04-28 01:30:13

1

可以使用select()系統調用來處理多個插座,當數據可用於讀取或寫入觸發動作。互聯網充滿了有關套接字編程的一般信息,也許開始here,其中包括一些其他良好信息的鏈接。

this one

幾乎所有關於網絡編程的書都應該有一些很好的例子。