マルチプロセスによるsocket同時問題の解決
5234 ワード
概念の理解
前のブログの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);
// bind ,
if( 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......
");
// fork , accept 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);
}