一、概述
案例:利用for改造上一节的服务端程序,让其能够和多个客户端之间收发数据。Client端代码请参考上一篇
二、代码示例
#include <iostream> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #define PORT 8888 #define MESSAGE_LEN 1024 int main(int argc, char const *argv[]) { int socket_fd,accept_fd; int on= 1; int ret =-1; int backlog = 10; pid_t pid; struct sockaddr_in localaddr ,remoteaddr; socket_fd = socket(AF_INET,SOCK_STREAM,0); char in_buff[MESSAGE_LEN] = {0}; //如果socket创建失败就退出 if(socket_fd==-1){ std::cout<<"Failed to create socket!"<<std::endl; exit(-1); } ret = setsockopt( socket_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); if(ret==-1){ std::cout<<"Failed 通setsocket options!"<<std::endl; exit(-1); } localaddr.sin_family=AF_INET; localaddr.sin_port = PORT; localaddr.sin_addr.s_addr = INADDR_ANY; bzero(&(localaddr.sin_zero),8); ret = bind(socket_fd, (struct sockaddr*)&localaddr,sizeof(struct sockaddr)); if(ret ==-1){ std::cout<< "Failed to bind addr!"<<std::endl; exit(-1); } ret = listen(socket_fd,backlog); if(ret==-1){ std::cout<< "Failed to bind listen socket!"<<std::endl; exit(-1); } for(;;){ socklen_t addr_len = sizeof(struct sockaddr); accept_fd = accept(socket_fd,(struct sockaddr*)&remoteaddr,&addr_len); pid = fork(); if(pid==0){//pid==0子进程 for(;;){ ret=recv(accept_fd,(void*)in_buff,MESSAGE_LEN,0); if(ret==0){ break; } std::cout << "recv:"<< in_buff<<std::endl; send(accept_fd,(void*)in_buff,MESSAGE_LEN,0); } close(accept_fd); } } //关闭父进程 if(pid!=0){ close(socket_fd); } return 0; }