1、服务器端:socket()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接。将accept()写入死循环,每次连接一个客户端,开一个线程。

2、一般情况下建立socket连接后服务器与客户端建立了一个管道,当关闭socket或关闭客户端的时候,会导致管道破裂信号。如果使用默认处理则会导致服务器程序退出。

需要程序忽略管道破裂信号。

signal(SIGPIPE, SIG_IGN);//忽略管道破裂信号

3、线程处理完毕后,需要及时关闭线程,通过recv()函数的特性,在socket关闭的时候返回零。判断并结束线程。

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <signal.h> //处理信号问题 应忽略socket 信号 #define MY_IP "192.168.149.137"
#define MY_PORT 5005
#define BACKLOG 100 #define DEBUF(X) printf(X)
int fd = -;
char buf[]; //最大连接数
void *func(void *arg)
{ char recv_buf[];
char send_buf[];
int client_fd = (int)arg;//传参
int ret = ;
memset(recv_buf,,sizeof(recv_buf));
while()
{
ret = recv(client_fd,&recv_buf,sizeof(recv_buf),);
if( == ret) break;//阻塞等待过程中断开则会返回0
printf("%s\n",recv_buf);
send(client_fd,&recv_buf,sizeof(recv_buf),);
memset(recv_buf,,sizeof(recv_buf));
}
printf("over \n");
}
int main()
{
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;//客户地址
socklen_t len = ;//接收长度
char recv_buf[];
char send_buf[];
int sock_fd = -;//监听描述符
int client_fd = -;//连接fd int ret = -;
pthread_t th =- ; signal(SIGPIPE, SIG_IGN);//忽略管道破裂信号
sock_fd = socket(AF_INET,SOCK_STREAM,);
if(- == sock_fd)
{
perror("socket");
return -;
}
printf("sock_fd = %d.\n",sock_fd);
//2.bind绑定socket 和本机IP 端口
server_addr.sin_family = AF_INET;//IPV4
server_addr.sin_port = htons(MY_PORT);//设置端口模式
server_addr.sin_addr.s_addr = inet_addr(MY_IP);//设置IP
ret = bind(sock_fd,(struct sockaddr *)&server_addr,sizeof(server_addr));
if(- == ret)
{
perror("bind");
return -;
}
DEBUF("bind ok\n");
//3.listen 设 置监听
ret = listen(sock_fd, BACKLOG);//BACKLOG为排队处理
if(- == ret)
{
perror("listen");
return -;
}
DEBUF("listen ok\n");
while()
{
client_fd = accept(sock_fd, (struct sockaddr *)&client_addr, &len);
if(- == client_fd)
{
perror("listen");
return -;
}
ret = pthread_create(&th ,NULL , func , (void*)client_fd);//创建线程
DEBUF("新用户加入\n");
if(ret != )
{
printf("pthread_create error \n");
return -;
}
}
return ;
}

socket利用多线程实现一对多通信的更多相关文章

  1. 利用多线程使socket服务端可以与多个客户端同时通讯

    利用多线程使socket服务端可以与多个客户端同时通讯 server import socket 1. 符合TCP协议的手机 server = socket.socket(socket.AF_INET ...

  2. VC中利用多线程技术实现线程之间的通信

    当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软 ...

  3. Python 多线程、多进程 (二)之 多线程、同步、通信

    Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...

  4. JAVASE02-Unit010: 多线程基础 、 TCP通信

    多线程基础 . TCP通信 * 当一个方法被synchronized修饰后,那么 * 该方法称为同步方法,即:多个线程不能同时 * 进入到方法内部执行. package day10; /** * 当多 ...

  5. [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)

    [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这 ...

  6. [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中)

    [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中) 本节要点: 上节介绍了多线程的基本使用方法和基本应用示例,本节深入介绍.NET ...

  7. [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上)

    [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上) 本节导读: 随着硬件和网络的高速发展,为多线程(Multithreading) ...

  8. Java多线程之线程的通信

    Java多线程之线程的通信 在总结多线程通信前先介绍一个概念:锁池.线程因为未拿到锁标记而发生的阻塞不同于前面五个基本状态中的阻塞,称为锁池.每个对象都有自己的锁池的空间,用于放置等待运行的线程.这些 ...

  9. java多线程与线程间通信

    转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...

随机推荐

  1. java的内存管理机制

    1.内存区域的分类 栈内存:基本类型变量和对象的引用,优势在于存取速度快 堆内存:new创建的对象和数组以及对象的实例化变量,优势在于动态分配内存,但是存取速度相对较慢 2.不同类型的内存分配 (1) ...

  2. 使用python快速搭建web服务器

    命令:python -m SimpleHTTPServer 8088 参考:https://www.cnblogs.com/harry-xiaojun/p/6739003.html https://w ...

  3. 第一个scrim任务分布

    一.项目经理:郭健豪 二.scrim分工 杨广鑫.郭健豪:制作第一个精选页面布局,和代码实现.如:实现图书推荐布局中图书的排布,搜索框代码的实现,消息提示的跳转 李明.郑涛:实现第一个精选页面数据库的 ...

  4. Java并发编程中的设计模式解析(二)一个单例的七种写法

    Java单例模式是最常见的设计模式之一,广泛应用于各种框架.中间件和应用开发中.单例模式实现起来比较简单,基本是每个Java工程师都能信手拈来的,本文将结合多线程.类的加载等知识,系统地介绍一下单例模 ...

  5. MySQL-常见数据拆分办法

    在生产环境中,由于业务的增长或者业务的拆分,DBA经常需要拆库操作.那么我们常见的拆库手段有哪些呢? 我这里提供几种解决办法: 1. 使用mysqldump 把表逻辑倒出,然后再source 到其它地 ...

  6. widows终端远程连接Linux服务器

    一.前言 为什么不是远程连接Linux服务器? 因为我不会,远程连接window我就用电脑自带的“远程桌面连接”. 以下所述都是在CentOS操作系统下的. 服务器刚换成Linux的时候很迷茫,感觉无 ...

  7. DAY8-Python学习笔记

    老样子课有点多,睡觉有点多,玩手机有点多,总结就是事情有点多.Python项目还没找好所以就没上手. 今天学习内容贴几张图...

  8. 题解 CF1005A 【Tanya and Stairways】

    楼上别说这个题水,这个题可能还真有不知道的知识点. 看到这个题,想到刚学的单调栈. 单调栈? 单调栈和单调队列差不多,但是我们只用到它的栈顶. 单调,意思就是一直递增或者递减. 这跟这个题有什么关系? ...

  9. C 函数——Day04

    C 函数 函数是一组一起执行一个任务的语句.每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 您可以把代码划分到不同的函数中.如何划分代码到不同的函数 ...

  10. laravel4 「时间戳」问题

    默认 Eloquent 会自动维护数据库表的 created_at 和 updated_at 字段.只要把这两个「时间戳」字段加到数据库表, Eloquent 就会处理剩下的工作.如果不想让 Eloq ...