2012-04-28 212 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

几乎所有关于网络编程的书都应该有一些很好的例子。