创作中心-CSDN
本文中在上述文章写好的代码进行TCP并发服务器多线程的编写
一.TCP并发服务器多线程
建立一个线程,将accpt函数写在循环里
写client_data_handle函数
从do语句哪里开始的代码之前工程中的read函数的代码,之前的read函数的代码就不需要写了
*(void*)arg,将arg强制转换成void *型的指针,然后取值
定义在调用之后就需要去声明
整体代码、
服务端是改好了,客户端也需要进行改动
atoi 字符串转化成整数
二.多进程的并发服务器
把上面的文件中线程部分的代码屏蔽
然后之前一样定义新的fd,在while循环中不断的接收
之后去创建进程
break : 当程序运行到这个语句时,会立刻离开这个循环,不再执行break下面的语句。跳出循环后,执行循环后面的语句。
continue :当程序运行到这个语句时,会立刻跳过本次循环,不再执行continue下面的语句。跳出本次循环后,会继续执行循环内的语句,直到循环结束。(在 for 循环和 while 循环中是有所差异的)
在子进程里实现accept接收的功能
在子进程中调用定义函数,这里子进程功能就完成了,不过还有缺陷,它没有退出的代码。
建立一个信好函数signal(x,x)
第一个参数是信号,第二个是执行什么函数
SIGCHLD是 Linux 和类 Unix 操作系统中的一个信号,用于通知父进程其子进程的状态发生了变化(如子进程终止、停止或继续执行)。SIGCHLD 是进程间通信的重要机制,尤其是在父进程需要管理多个子进程时。SIGCHLD 的基本信息:信号编号:17默认行为:忽略(SIG_IGN)触发条件: 子进程终止(正常退出或被信号终止),子进程被信号暂停(如 SIGSTOP),子进程从暂停状态恢复(如 SIGCONT)SIGCHLD作用通知父进程:当子进程的状态发生变化时,内核会向父进程发送 SIGCHLD 信号。避免僵尸进程:父进程可以通过捕获 SIGCHLD 信号并调用 wait() 或 waitpid()来回收子进程的资源,避免僵尸进程的产生。
waitpid()
第一个参数:pid,正常给-1
第二个参数:状态
第三个参数:option,有WNOHANG :如果没有子进程立即返回
三.TCP补充
1.send()函数
ssize_t send(int sockfd,
const void *buf,
size_t len,
int flags
);
参数:sockfd:socket函数返回的fdbuffer:发送缓冲区首地址length:发送的字节flags:发送方式(通常为0),作用和write一样MSG_DONTWAIT,非阻塞MSG_OOB:用于TCP类型的带外数据(out of band)
返回值:成功:实际发送的字节数失败:-1,并设置errno
2.网络中接收数据:
网络中接收数据:
2.recv() /read()int recv( SOCKET s, char FAR *buf, int len, int flags);flag:一般填0,和read作用一样
特殊的标志:MSG_DONTWAITMSG_OOB:读取带外数据MSG_PEEK:流