服务器编程入门(10)TCP回射服务器实现 - 并发
#include "mtserver.h" int main(int argc, char* argv[])
{
checkArgc(argc, 2); const char* ip = argv[1];
int port = atoi( argv[2] ); /* 1 declare socket*/
int listenfd, connfd;
int ret; /* 2 initialize listen socket*/
mySocket(listenfd); /* 3 server address */
struct sockaddr_in servaddr;
initSockAddr(servaddr, ip, port); /* 4 bind */
myBind(listenfd,
(struct sockaddr*)&servaddr,
sizeof(servaddr)); /* 5 listen */
myListen(listenfd, 5); /* handle SIGCHLD signal*/
signal(SIGCHLD, handle_sigchild); /* 6 waiting for connecting */
pid_t chipid;
socklen_t clilen;
struct sockaddr_in cliaddr; for(;;) {
clilen = sizeof(cliaddr);
std::cout << "Waiting for connecting ..." << std::endl;
connfd = myAccept(listenfd,
(struct sockaddr*)&cliaddr,
&clilen);
printf("Connection %d established...\n", listenfd);
if ( (chipid=fork()) == 0 ) {
handle_recv(connfd);
}
} }
void handle_recv(int connfd) {
char recvbuf[BUFSIZE];
while(1) {
memset( recvbuf, '\0', BUFSIZE );
if ( recv(connfd, recvbuf,BUFSIZE,0) != 0) {
if (!strcmp(recvbuf, "exit"))
break;
fprintf(stderr,"recv msg: %s\n", recvbuf);
send(connfd, recvbuf, strlen(recvbuf), 0);
fprintf(stderr,"send back: %s\n\n", recvbuf);
}
}
close(connfd);
exit(0);
}
void handle_sigchild(int signo)
{
pid_t pid;
int stat;
while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0 ) {
fprintf(stderr,
"child %d terminated\n",
pid);
return;
}
}#include "mtclient.h" int main(int argc, char* argv[])
{
if (argc <=2 ) {
std::cout << "server ip and port needed." << std::endl;
return 1;
} int port = atoi(argv[2]);
char* ip = argv[1]; int sockfd;
struct sockaddr_in servaddr; mySocket(sockfd); initSockAddr(servaddr,ip, port); myConnect(sockfd,
(struct sockaddr*)&servaddr,
sizeof(servaddr)); handle_msg(sockfd);
exit(0); }
void handle_msg(int sockfd) {
char sendbuf[BUFSIZE];
char recvbuf[BUFSIZE];
while(1) {
memset( sendbuf, '\0', BUFSIZE );
memset( recvbuf, '\0', BUFSIZE );
printf("%s", "send msg:");
gets(sendbuf);
if (strlen(sendbuf) > 0)
send(sockfd,sendbuf,strlen(sendbuf),0);
if ( !strcmp(sendbuf, "exit"))
break;
recv(sockfd,recvbuf,BUFSIZE,0);
printf("recv back:%s\n\n", recvbuf);
}
close( sockfd );
return;
}#include <signal.h>
_sighandler_t signal ( int sig, _sighandler_t _handler );
for( ; ; ) {
chilen = sizeof(cliaddr);
if ( (connfd = accept(listenfd, (struct sockaddr* ) &cliaddr, &clilen )) < 0 )
{
if (errno == EINTR) // 检测到错误类型为EINTR时,重启accept系统调用
continue;
else
err_sys ("accept error");
}
}#include <sys/wait.h>
pid_t wait( int *statloc );
pid_t waitpid(pid_t pid, int *statloc, int options);
void sig_child(int signo)
{
pid_t pid;
int stat;
while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0 )
printf("Child %d terminated\n", pid);
return;
}
服务器编程入门(10)TCP回射服务器实现 - 并发的更多相关文章
- TCP回射服务器修订版(ubuntu 18.04)
一.需求 把https://www.cnblogs.com/soldierback/p/10673345.html中的TCP回射服务器程序重写成使用select来处理任意个客户的单进程 程序,而不是为 ...
- TCP回射服务器程序:main函数
TCP回射并发服务器 1.创建套接字,绑定服务器的众所周知端口 创建一个TCP套接字,在待绑定到该TCP套接字的网际网套接字地址结构中填入通配地址(INADDR_ANY) 和服务器的众所知周(SERV ...
- UNIX网络编程——TCP回射服务器/客户端程序
下面通过最简单的客户端/服务器程序的实例来学习socket API. serv.c 程序的功能是从客户端读取字符然后直接回射回去: #include<stdio.h> #include&l ...
- TCP回射服务器程序:str_echo函数
str_echo函数执行处理每个客户的服务: 从客户读入数据,并把它们回射给客户 读入缓冲区并回射其中内容: read函数从套接字读入数据,writen函数把其中内容回射给客户 如果客户关闭连接,那么 ...
- 服务器编程入门(5)Linux服务器程序规范
问题聚焦: 除了网络通信外,服务器程序通常还必须考虑许多其他细节问题,这些细节问题涉及面逛且零碎,而且基本上是模板式的,所以称之为服务器程序规范. 工欲善其事,必先利其器,这篇主要来探 ...
- UNIX网络编程——使用线程的TCP回射服务器程序
同一进程内的所有线程除了共享全局变量外还共享: (1)进程指令: (2)大多数数据: (3) 打开的文件(即描述符): (4)信号处理函数和信号处置: (5)当前工作目录: (6)用户ID和组ID. ...
- 【Unix网络编程】chapter5TCP回射服务器程序
chapter5 5.1 概述 5.2 TCP回射服务器程序:main函数 int main(int argc, char **argv) { int listenfd,connfd; pid_t ...
- TCP客户/服务器程序实例——回射服务器
目录 客户/服务器程序源码 POSIX信号处理 POSIX信号语义 处理SIGCHLD信号 处理僵死进程 处理被中断的系统调用 wait和waitpid函数 wait和waitpid函数的区别 网络编 ...
- 【Unix网络编程】 chapter5 TCP客户,服务器程序实例
chapter5 5.1 概述 5.2 TCP回射服务器程序:main函数 int main(int argc, char **argv) { int listenfd,connfd; pid_t c ...
随机推荐
- Web前端,高性能优化
高性能HTML 一.避免使用iframe iframe也叫内联frame,可将一个HTML文档嵌入另一个HTML文档中. iframe的好处是,嵌入的文档独立于父文档,通常也借此使浏览器模拟多线程.缺 ...
- [置顶] 遇到难题(bug)的解决方法心得
今天早上花了2个小时解决一个问题...界面抖动.. 最近把淄博项目的界面用BT改了,后来发现4个界面之间切换会抖动.. 就是整个界面会左右抖动... 文章出处: PHP攻城师 www.phpgcs.c ...
- Android学习笔记(九)——更复杂的进度对话框
显示操作进度的对话框 1.使用上一篇创建的同一项目.在activity_main.xml文件里加入一个Button: <Button android:id="@+id/btn_dial ...
- python 下载整个站点
用python实现的下载整个站点工具. 核心流程非常easy: 1. 输入站点地址 2. url.得到响应的内容. 3. 依据响应的http报文头,假设类型为html, 则从第4步開始运行. 假设是其 ...
- Redis核心解读:集群管理工具(Redis-sentinel)
Redis核心解读:集群管理工具(Redis-sentinel) - Redis - TechTarget数据库 Redis核心解读:集群管理工具(Redis-sentinel)
- Datatable.Compute小技巧
在个人版机房重构的过程中,大家最发愁的一件事无非就是上下机,结账和报表.那么在结账的过程中,最发愁的是否就数计算日结账单的数据和周结账的数据.还记得在第一遍机房收费系统的过程中用的是for 循环,但是 ...
- 【Visual C++】绘图函数BitBlt的使用方法
BitBlt 该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境. 原型: BOOL BitBlt( HDC hdcDest, int nXDest, ...
- 图解UML类与类之间的六中关系
大话设计模式上的一个图,我用EA画出来的: UML中的6大关系相关英文及音标: 依赖关系 dependency [di'pendənsi] 关联关系 association [ə,səuʃi' ...
- FFT算法的物理意义
FFT是离散傅立叶变换的高速算法,能够将一个信号变换到频域.有些信号在时域上是非常难看出什么特征的,可是如果变换到频域之后,就非常easy看出特征了.这就是非常多信号分析採用FFT变换的原因.另外,F ...
- TCP、UDP数据包大小的限制(UDP数据包一次发送多大为好)——数据帧的物理特性决定的,每层都有一个自己的数据头,层层递减
1.概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Da ...