2017-10-27 10 views
0
#include <sys/socket.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <netinet/in.h> 
#include <unistd.h> 
#include <iostream> 
#include <pthread.h> 

int f(int x) { 
    if (x == 0) return 1; 
    return x % 100; 
} 

void *deal(void *arg) { 
    int fd = * (int *) arg; 
    int x; 
    int n = read(fd, &x, sizeof x); 
    if (n < 0) std::cout << "error reading" << std::endl; 
    std::cout << "request " << x << " received" << std::endl; 
    int y = f(x); 
    write(fd, &y, sizeof y); 
    std::cout << "response to " << x << ": " << y << std::endl; 
    close(fd); 
    return NULL; 
} 

int main(int argc, char *argv[]) { 
    int port = atoi(argv[1]); 
    int socket_fd = socket(AF_INET, SOCK_STREAM, 0); 
    sockaddr_in addr; 
    addr.sin_family = AF_INET; 
    addr.sin_addr.s_addr = INADDR_ANY; 
    addr.sin_port = htons(port); 
    bind(socket_fd, (sockaddr *) &addr, sizeof addr); 
    listen(socket_fd, 20); 
    std::cout << "listen on " << port << std::endl; 
    sockaddr remote_addr; 
    socklen_t len; 
    for (; ;) { 
     int fd = accept(socket_fd, &remote_addr, &len); 
     pthread_t p; 
     pthread_create(&p, NULL, deal, (void *) &fd); 
    } 
    return 0; 
} 

これはサーバーのコードです。それぞれの接続に対して新しいスレッドを作成し、整数を読み取り、整数%100で応答します。なぜこの単純なサーバーは非常に低い同時要求で失敗しますか?

同時リクエストがない場合はうまく動作します。ただし、同時に実行する必要があります。しかし、10回の同時リクエストでは失敗しました。

+3

変更

pthread_create(&p, NULL, deal, (void *) &fd); 

pthread_create(&p, NULL, deal, (void *) fd); 

そして

void *deal(void *arg) { int fd = * (int *) arg; 

それはC++です。 pthreadsの代わりにstd :: threadを使用してください。 –

+0

引数として渡す 'int'ポインタは、ループの次回にスコープからすぐに出る' int'を指します。 – Galik

答えて

0

別のスレッドでfdの時間と時間のメモリを再度使用しています。私。それぞれの受理で上書きされています。

void *deal(void *arg) { 
int fd = (int) arg; 
関連する問題