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. 必应词典手机版(IOS版)与有道词典(IOS版)之问卷分析

    我们制定了一个调查问卷: 1.年龄分布: 2.地域分布: 3.是否用过必应词典? 对于必应词典还是没用过的人数更多. 4.是否用过有道词典? 有道词典的使用率更高一点. 5.对于必应的基本功能给几分? ...

  2. 课堂练习 psp表

    项目计划总结表: 日期 编程 完善程序 测试程序 参考资料 日总结 3.20 18:00---19:30       1.5 3.21   9:30----10:00 10:00---10:30   ...

  3. HTML和CSS <h1> --3-- <h1>

    标签语义化,让网页更好的被搜索引擎理解 标签的用途:我们学习网页制作时,常常会听到一个词,语义化.那么什么叫做语义化呢,说的通俗点就是:明白每个标签的用途(在什么情况下使用此标签合理)比如,网页上的文 ...

  4. 【区间DP】codevs3657 括号序列题解

    题目描述 Description 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合法的,那么AB ...

  5. java thread start() 和 run() 区别

    1.start() public static void main(String[] args) { // TODO 自动生成的方法存根 Thread t = new Thread() { publi ...

  6. [BUAA_SE_2017]个人作业-Week1

    个人作业-Week1 疑问 教材中说,PM在衡量需求时需要方方面面的能力与研究.可是,当下许多互联网IT公司只承担外包业务,即客户给什么需求就实现什么需求,甚至可能不要求其它先进的功能.此时,开发团队 ...

  7. BeTa阶段Day4

    一.提供当天站立式会议照片一张 二.每个人的工作 1.讨论项目每个成员的昨天进展 刘阳航:优化障碍物生成. 林庭亦:调整难度设置. 郑子熙:改进UI,美化界面. 陈文俊:优化代码结构. 2.讨论项目每 ...

  8. PAT 甲级 1150 Travelling Salesman Problem

    https://pintia.cn/problem-sets/994805342720868352/problems/1038430013544464384 The "travelling ...

  9. 微信小程序wx:for和wx:for-item的正确用法

    wx:for="{{list}}"用来循环数组,而list即为数组名wx:for-item="items" 即用来定义一个循环过程中每个元素的变量的 如果是一维 ...

  10. ACM数论之旅14---抽屉原理,鸽巢原理,球盒原理(叫法不一又有什么关系呢╮(╯▽╰)╭)

    这章没有什么算法可言,单纯的你懂了原理后会不会运用(反正我基本没怎么用过 ̄ 3 ̄) 有366人,那么至少有两人同一天出生(好孩子就不要在意闰年啦( ̄▽ ̄")) 有13人,那么至少有两人同一月 ...