マルチプロセスによるsocket同時問題の解決


概念の理解


前のブログのsocketプログラムでは、サーバが1つのクライアントに接続できるだけで、同時接続の問題を解決できず、複数のクライアントが同時に接続できません.次のプログラムはマルチプロセスの考え方を採用し,accept()呼び出し後にfork()を用いてサブプロセスを生成する.

コード実装


サーバ側コードのみが提供され、クライアントは変更する必要はありません.
#include
#include
#include
#include
#include
#include
#include
#define SERV_PORT 9998
#define MAXLINE 4096

int main(int argc, char** argv)
{
    int    socket_fd, connect_fd;
    struct sockaddr_in     servaddr;
    char    buf[MAXLINE],sendbuf[MAXLINE];
    int     len;
    pid_t   pid;
    if( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
    printf("create socket error: %s(errno: %d)
"
,strerror(errno),errno); exit(0); } // memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IP INADDR_ANY, IP 。 servaddr.sin_port = htons(SERV_PORT); // bindif( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) <0) { printf("bind socket error: %s(errno: %d)
"
,strerror(errno),errno); exit(0); } // listen if( listen(socket_fd, 10) <0) { printf("listen socket error: %s(errno: %d)
"
,strerror(errno),errno); exit(0); } printf("waiting for client's connection......
"
); // forkaccept fork if(pid=fork()<0) { perror("fork "); exit(-1); } if(pid==0) { connect_fd = accept(socket_fd,(struct sockaddr*)NULL,NULL); while((len= recv(connect_fd, buf, MAXLINE, 0))>0) { printf("receive message from client: %s
"
, buf); // printf("send message to client:
"
); fgets(sendbuf, 4096, stdin); if( send(connect_fd, sendbuf, strlen(sendbuf), 0) < 0) { printf("send messaeg error: %s(errno: %d)
"
, strerror(errno), errno); exit(0); } } } close(connect_fd); close(socket_fd); }