S10、并发程序-套接字通信S10、并发程序-套接字通信
S10、并发程序-套接字通信1、套接字通信服务器程序sockserver.c:
S10、并发程序-套接字通信#includeunistd.h#includesys/types.h#includesys/socket.h#includenetinet/in.h#includesignal.h#includestdio.h#includestdlib.h#includestring.h#includepthread.h#includesemaphore.h#defineLinkNum5 //连接数intclient_sockfd[LinkNum]; /*分别记录服务器端的套接字与连接的多个客户端的套接字*/intserver_sockfd=-1; //命名套接字intcurLink=0; //当前连接数sem_tmutex; //表示连接数的资源信号量charstopmsg[100]; //服务器端发送消息缓冲区
S10、并发程序-套接字通信voidquit(){//客户服务通信结束处理函数inti;char*msg=服务器将要关闭了!;while(1){if(strcmp(stopmsg,quit)==0){//如果服务器端发送消息为quit,则提示服务器将关闭printf(服务器关闭!\n); for(i=0;iLinkNum;i++)if(client_sockfd[i]!=-1) write(client_sockfd[i],msg,sizeof(msg));/*依次向继续保持连接的客户端发出“服务器将关闭”的通知消息*/close(server_sockfd); //关闭服务器监听套接字 sem_destroy(mutex); //销毁连接数资源信号量mutexexit(0);}}}
S10、并发程序-套接字通信voidrcv_snd(intn){//服务器与客户端的收发通信函数,n为连接数组序号inti=0;intretval;charrecv_buf[1024]; //接收消息缓冲区charsend_buf[1024]; //发送消息缓冲区intclient_len=0;intrcv_num; //从客户端接收到的消息长度pthread_ttid; //线程idtid=pthread_self(); //获取当前线程idprintf(-----------服务器线程id=%u使用套接字%d,n=%d与客户机对话开始...\n,tid,client_sockfd[n],n);do{//服务器与客户端循环发送接收消息 memset(recv_buf,0,1024);//接收消息缓冲区清零 printf(服务器线程id=%u,套接字%d,n=%d等待客户端回应...\n,tid,client_sockfd[n],n);rcv_num=read(client_sockfd[n],recv_buf,sizeof(recv_buf));
S10、并发程序-套接字通信 printf(服务器线程id=%u,套接字%d,n=%d从客户端接受的消息长度=%d\n,tid,client_sockfd[n],n,strlen(recv_buf));printf(3.服务器线程id=%u,套接字%d,n=%d---客户端,服务器从客户端接受的消息是:(%d):%s\n,tid,client_sockfd[n],n,rcv_num,recv_buf); if(rcv_num==0)break; sleep(1); if(strncmp(recv_buf,!q,2)==0)break; //若接收到!q,则结束循环,通信结束printf(4.服务器线程id=%u,套接字%d,n=%d---客户端,请输入服务器要发送给客户机的消息:,tid,client_sockfd[n],n); memset(send_buf,0,1024); //发送消息缓冲区清零scanf(%s,send_buf); //服务器端键盘输入字符串消息,输入!q或quit,则通信结束 strcpy(