接上回,socket通信,server与多客户端通信的文章。
搞一个先fork一堆子进程出来,再一起监听的server,client程序不变。
复制代码
#include<netinet/in.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/signal.h>
#include<sys/wait.h>
#define HELLO_WORLD_SERVER_PORT    6666
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024
void reaper(int sig){
int status;
while(    wait3(&status,WNOHANG,(struct rusage*)0)  >=0   )
;
}
int main(int argc, char **argv){
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htons(INADDR_ANY);
server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
int server_socket = socket(AF_INET,SOCK_STREAM,0);
if( server_socket < 0){
printf("Create Socket Failed!");
exit(1);
}
if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr))){
printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);
exit(1);
}
fprintf(stderr,"Before Main Process listen.\n");
if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) ){
printf("Server Listen Failed!");
exit(1);
}
fprintf(stderr, "After Main Process listen.\n");
(void)signal(SIGCHLD,reaper);
struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr);
int procnt;
for (procnt=0; procnt<10; procnt++){
int child_process_pid = fork(); 
if(child_process_pid == 0 ){
fprintf(stderr,"Child %d is born",getpid());
fprintf(stderr,"Before accept. In %d.\n",getpid());
int new_server_socket = 
accept(server_socket,(struct sockaddr*)&client_addr,&length);
if ( new_server_socket < 0){
printf("Server Child Accept Failed!\n");
break;
}
fprintf(stderr,"After accept. In %d.\n",getpid());
close(server_socket);
char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);
strcpy(buffer,"Hello,World! FromServer! ");
int pd;
pd=getpid();
char cpd[10];
sprintf(cpd,"%d",pd);
strcat(buffer,cpd);
strcat(buffer,"\n");            
send(new_server_socket,buffer,BUFFER_SIZE,0);
bzero(buffer,BUFFER_SIZE);
length = recv(new_server_socket,buffer,BUFFER_SIZE,0);
if (length < 0){
printf("Server Recieve Data Failed!\n");
exit(1);
}
fprintf(stderr,"got: %s in %d\n",buffer,getpid());
//I should put here some rest dealings 
//for current child process instead.
//I will add it later.
close(new_server_socket);
exit(0);
}else{
//do nothing
}
}
for(;;){
sleep(10);
fprintf(stderr,"I am main process waked from sleep.\n");
}
close(server_socket);
return 0;
}
复制代码
这样,client 和 server的通信,实际上就是server里面一群子进程在监听。谁逮住了谁响应。当然,这个进程池尚且有差距。今后再改进,考虑一次服务结束后,如何休眠和唤醒。
为了看着方便,把client的程序也放在这里:
复制代码
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define HELLO_WORLD_SERVER_PORT    6666
#define BUFFER_SIZE 1024
void talk_to_server(char ** argv)
{   
struct sockaddr_in client_addr;
bzero(&client_addr,sizeof(client_addr));
client_addr.sin_family = AF_INET;
client_addr.sin_addr.s_addr = htons(INADDR_ANY);
client_addr.sin_port = htons(0);
int client_socket = socket(AF_INET,SOCK_STREAM,0);
if( client_socket < 0){
printf("Create Socket Failed!\n");
exit(1);
}
if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr))){
printf("Client Bind Port Failed!\n");
exit(1);
}
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
if(inet_aton(argv[1],&server_addr.sin_addr) == 0){
printf("Server IP Address Error!\n");
exit(1);
}
server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
socklen_t server_addr_length = sizeof(server_addr);
if( 
connect( client_socket, (struct sockaddr*)&server_addr, 
server_addr_length) < 0){
printf("Can Not Connect To %s!\n",argv[1]);
exit(1);
}
char buffer[BUFFER_SIZE];
bzero(buffer,BUFFER_SIZE);
int length = recv(  client_socket,  buffer,BUFFER_SIZE,0);
if(length < 0){
printf("Recieve Data From Server %s Failed!\n", argv[1]);
exit(1);
}
printf("From Server %s :\t%s",argv[1],buffer);
bzero(buffer,BUFFER_SIZE);
char name[64];
gethostname(name,sizeof(name));
strcpy(buffer,name);
send(client_socket,buffer,BUFFER_SIZE,0);
close(client_socket);
}
int main(int argc, char **argv)
{
if (argc != 2){
printf("Usage: ./%s ServerIPAddress\n",argv[0]);
exit(1);
}
int i=0;
for(i=0; i<10000; i++){
talk_to_server(argv);
sleep(10);
}
return 0;
}
复制代码
server端运行结果如下:
复制代码
Before Main Process listen.
After Main Process listen.
Child 3882 is bornBefore accept. In 3882.
Child 3883 is bornBefore accept. In 3883.
Child 3884 is bornBefore accept. In 3884.
Child 3885 is bornBefore accept. In 3885.
Child 3886 is bornBefore accept. In 3886.
Child 3887 is bornBefore accept. In 3887.
Child 3888 is bornBefore accept. In 3888.
Child 3889 is bornBefore accept. In 3889.
Child 3890 is bornBefore accept. In 3890.
Child 3891 is bornBefore accept. In 3891.
I am mian process waked from sleep.
I am mian process waked from sleep.
I am mian process waked from sleep.
After accept. In 3882
got: post2.gao in 3882
After accept. In 3883
got: post2.gao in 3883
After accept. In 3884
got: post2.gao in 3884
After accept. In 3885
got: post2.gao in 3885
After accept. In 3886
got: post2.gao in 3886
After accept. In 3887
got: post2.gao in 3887
After accept. In 3888
got: post2.gao in 3888
After accept. In 3889
got: post2.gao in 3889
After accept. In 3890
got: post2.gao in 3890
After accept. In 3891
got: post2.gao in 3891
I am mian process waked from sleep.
I am mian process waked from sleep.
I am mian process waked from sleep.
I am mian process waked from sleep.
复制代码
本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/08/03/2620964.html,如需转载请自行联系原作者

socket通信,server与多客户端通信(二)相关推荐

  1. 一段最简单的使用socket.io进行服务器和客户端通信的例子代码

    服务器端代码: var app = require('express')(); var server = require('http').Server(app); var io = require(' ...

  2. python socket华为云服务器和客户端通信(tcy)

    经过无数次测试,失败,失败,失败,和华为技术沟通,失败,失败,失败,上网查询,没有:我都有些心灰意冷,最终解决,分享给大家. 不是替华为打广告,服务应该是没得说,有时一个问题的解决他是一个团队来处理的 ...

  3. 服务器与HTML客户端通信,服务器与HTML客户端通信

    弹性云服务器 ECS 弹性云服务器(Elastic Cloud Server)是一种可随时自助获取.可弹性伸缩的云服务器,帮助用户打造可靠.安全.灵活.高效的应用环境,确保服务持久稳定运行,提升运维效 ...

  4. linux多个客户端如何通信_linux实现多个客户端通信进阶

    2020.07.31 linux分享 ● ● ● #01#前言 前情回顾: 在整理上学期资料同时将部分代码分享,将以代码书写时间为时间线,按优化程度逐步发出,代码均为在linux下c编程. 上回功能: ...

  5. JAVA之socket编程服务器与客户端通信--实现简易聊天室

    本文将介绍TCP和UDP两种服务器与客户端之间的通信协议 1.首先介绍TCP和UDP分别是什么:TCP(Transfer Control Protocol) 是传输控制协议的缩写,被称 TCP / I ...

  6. Java中Socket通信-服务端和客户端双向传输字符串实现

    场景 什么是socket 在计算机通信领域,socket 被翻译为"套接字",它是计算机之间进行通信的一种约定或一种方式.通过 socket 这种约定,一台计算机可以接收其他计算机 ...

  7. Java 基于 UDP 实现 Socket中的多客户端通信

    这里原理同 TCP/IP 实现多客户端通信的原理是一样的,同样的 UDPClient.java 不变,与上一篇文章中描述的一致,无需修改 UDPServer.java package com.lear ...

  8. C# Socket服务端与客户端通信(包含大文件的断点传输)

    步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收 ...

  9. socket编程 -- epoll模型服务端/客户端通信的实现

    https://blog.csdn.net/y396397735/article/details/50680359 本例实现如下功能: 支持多客户端与一个服务端进行通信,客户端给服务端发送字符串数据, ...

  10. php 连接socket服务器_PHP-Socket服务端客户端发送接收通信实例详解

    Socket介绍 什么是socket 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求 ...

最新文章

  1. GNU/Linux平台上正则表达式的简单使用
  2. r语言绘制精美pcoa图_如何绘制精美的PCoA图形?
  3. c++ STL unique , unique_copy函数
  4. 树 森林 二叉树 遍历
  5. ubuntu 源码安装nginx
  6. Office 365 SharePoint 迁移浅谈 (一)开篇介绍
  7. php object
  8. struts2学习笔记(一):配置struts2开发环境
  9. C语言学习系列(六)存储类
  10. BERT4Rec:知道用户的播放(购买、点击、...)序列 item1, item2, item3,预测下一个播放的item问题。
  11. mapxtreme 查找指定位置的图元
  12. Lrc歌词批量下载助手 MP3歌词批量下载助手
  13. Unity 艺术字体制作
  14. 翟菜花:她经济的营销攻坚战,4C的用户导向才是破局之法
  15. 机器学习sklearn----通过轮廓系数确定适合的n_clusters
  16. php文字加边框,图片加特效文字 图片添加各种边框的文字效果 如果有多种边框模板就更好了...
  17. 充电站网络安全风险危及电动汽车普及
  18. 微信小程序之swiper无限轮播实现效果
  19. 中国互联网的沧海桑田
  20. K8S 报错笔记--持续更新

热门文章

  1. JDBC连接池DBUtils使用
  2. HTML组件化CSS方面的思考
  3. HTML5微数据学习笔记
  4. Quartz.NET WinFrom 关闭程序后无法结束进程
  5. com scripting读书笔记
  6. mysql查看和修改密码策略
  7. 圆形刻度盘 进度 展示
  8. 上次遗留下来的XMLUtil的问题
  9. IE和火狐兼容文章javascript兼容
  10. 结构等待队列[网络编程]select流程分析