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 に答える