1

私はこれを書きました:

クライアント:

printf("\nType a string: (STOP to ending connection)\n\n");
do{
    while ((c = getchar ()) != '\n' && i < MAXLENGHT){
    buf[i++] = c;
}
buf[i] = '\0';
len = strlen(buf);
}
while( strcmp(buf,"STOP")!=0);
close(sockfd);
exit(0);
}

サーバ:

int main (int argc, char **argv) {
int sock, fd;
socklen_t client_len;
struct sockaddr_in server, client;


if ((sock = socket (AF_INET, SOCK_STREAM, 0)) == -1) {
    perror ("Socket failed");
    exit (1);
}

server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons (SERVER_PORT);


if (bind ( sock, (struct sockaddr *) &server, sizeof server) == -1) {
    perror ("bind failed");
    exit (2);
}

listen (sock,1);


    while (1) {
    client_len = sizeof (client);
    if ((fd = accept ( sock, (struct sockaddr *) &client, &client_len)) < 0) {
        perror ("accepting connection");
        exit(3);
    }
    fprintf (stderr, "\nOpen.\n");
    send (fd, "\nWelcome!\n", 50, 0);
    check_stats (fd, fd);}

    close(fd);
    fprintf (stderr, "\nClose\n");
    exit (0);


 }  

.

void check_stats(int in, int out)

サーバーが文字列を受信し、いくつかのことを行い、それをクライアントに送り返す関数です。私の質問は次のとおりです。サーバーのコードで、前に置く必要があるもの

close(fd)

ユーザーが「STOP」と入力すると、サーバーは終了しますが、終了する前に別のBYE文字列をクライアントに送信しますか? で問題が発生しています

recv(int sockfd, void *buf, size_t len, int flags);

関数。私が主に入れなければならないのは、

int sockfd

?

4

1 に答える 1

0

sockfd は、サーバーとの通信に使用しているソケットを指します。 http://linux.die.net/man/2/recv

関数のプロトタイプは次のとおりです。 ssize_t recv(int sockfd, void *buf, size_t len, int flags);

考えてみると、使用しているソケットに関数を提供しない場合、データを取得する場所を他にどのように知ることができるでしょうか?

于 2013-01-13T20:12:11.633 に答える