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);
}
4

2 回答 2

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); 
    }
}
于 2012-04-28T00:14:44.827 回答
1

您可以使用select()系统调用来处理多个套接字并在数据可用于读取或写入时触发操作。互联网上充斥着关于套接字编程的一般信息,也许从这里开始,其中包括一些指向其他好的信息的链接。

还有这个

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

于 2012-04-28T00:12:42.880 回答