c多线程编程实战源码(c# 多线程编程实例)
c语言多线程编程问题
C语言中多线程c多线程编程实战源码的实现原理就是线程的原理c多线程编程实战源码,本人只了解Linux下面的C,linux下面的线程,不就是进程中的一个控制流么,相对来说代码很简单,但是原理却是很复杂,很难说清,还需要自己详细学习研究,下面是一个很简单的例子,哪边都能找到,自己运行下看看吧
#include pthread.h
#include stdio.h
#include sys/time.h
#include string.h
#define MAX 10
pthread_t thread[2];
pthread_mutex_t mut;
int number=0, i;
void *thread1()
printf ("thread1 : I'm thread 1\n");
for (i = 0; i MAX; i++)
printf("thread1 : number = %d\n",number);
pthread_mutex_lock(mut);
number++;
pthread_mutex_unlock(mut);
sleep(2);
printf("thread1 :主函数在等c多线程编程实战源码我完成任务吗c多线程编程实战源码?\n");
pthread_exit(NULL);
void *thread2()
printf("thread2 : I'm thread 2\n");
for (i = 0; i MAX; i++)
printf("thread2 : number = %d\n",number);
pthread_mutex_lock(mut);
number++;
pthread_mutex_unlock(mut);
sleep(3);
printf("thread2 :主函数在等我完成任务吗?\n");
pthread_exit(NULL);
void thread_create(void)
int temp;
memset(thread, 0, sizeof(thread)); //comment1
/*创建线程*/
if((temp = pthread_create(thread[0], NULL, thread1, NULL)) != 0) //comment2
printf("线程1创建失败!\n");
else
printf("线程1被创建\n");
if((temp = pthread_create(thread[1], NULL, thread2, NULL)) != 0) //comment3
printf("线程2创建失败");
else
printf("线程2被创建\n");
void thread_wait(void)
/*等待线程结束*/
if(thread[0] !=0) { //comment4
pthread_join(thread[0],NULL);
printf("线程1已经结束\n");
if(thread[1] !=0) { //comment5
pthread_join(thread[1],NULL);
printf("线程2已经结束\n");
int main()
/*用默认属性初始化互斥锁*/
pthread_mutex_init(mut,NULL);
printf("我是主函数哦,我正在创建线程,呵呵\n");
thread_create();
printf("我是主函数哦,我正在等待线程完成任务阿,呵呵\n");
thread_wait();
return 0;
高手进,关于C语言在windows上建立多线程的问题(VC6.0上实现)
东西c多线程编程实战源码,往往实例才是最让人感兴趣c多线程编程实战源码的,老是学基础理论,不动手,感觉没有成就感,呵呵。
下面先来一个实例。我们通过创建两个线程来实现对一个数的递加。
或许这个实例没有实际运用的价值,但是稍微改动一下,我们就可以用到其他地方去拉。
下面是我们的代码:
/*thread_example.c : c multiple thread programming in linux
*author : falcon
*E-mail : tunzhj03@st.lzu.edu.cn
#include pthread.h
#include stdio.h
#include sys/time.h
#include string.h
#define MAX 10
pthread_t thread[2];
pthread_mutex_t mut;
int number="0", i;
void *thread1()
printf ("thread1 : I'm thread 1\n");
for (i = 0; i MAX; i++)
printf("thread1 : number = %d\n",number);
pthread_mutex_lock(mut);
number++;
pthread_mutex_unlock(mut);
sleep(2);
printf("thread1 :主函数在等我完成任务吗c多线程编程实战源码?\n");
pthread_exit(NULL);
void *thread2()
printf("thread2 : I'm thread 2\n");
for (i = 0; i MAX; i++)
printf("thread2 : number = %d\n",number);
pthread_mutex_lock(mut);
number++;
pthread_mutex_unlock(mut);
sleep(3);
printf("thread2 :主函数在等我完成任务吗?\n");
pthread_exit(NULL);
void thread_create(void)
int temp;
memset(thread, 0, sizeof(thread)); //comment1
/*创建线程*/
if((temp = pthread_create(thread[0], NULL, thread1, NULL)) != 0) //comment2
printf("线程1创建失败!\n");
else
printf("线程1被创建\n");
if((temp = pthread_create(thread[1], NULL, thread2, NULL)) != 0) //comment3
printf("线程2创建失败");
else
printf("线程2被创建\n");
void thread_wait(void)
/*等待线程结束*/
if(thread[0] !=0) { //comment4
pthread_join(thread[0],NULL);
printf("线程1已经结束\n");
if(thread[1] !=0) { //comment5
pthread_join(thread[1],NULL);
printf("线程2已经结束\n");
int main()
/*用默认属性初始化互斥锁*/
pthread_mutex_init(mut,NULL);
printf("我是主函数哦,我正在创建线程,呵呵\n");
thread_create();
printf("我是主函数哦,我正在等待线程完成任务阿,呵呵\n");
thread_wait();
return 0;
下面我们先来编译、执行一下
引文:
falcon@falcon:~/program/c/code/ftp$ gcc -lpthread -o thread_example thread_example.c
falcon@falcon:~/program/c/code/ftp$ ./thread_example
我是主函数哦,我正在创建线程,呵呵
线程1被创建
线程2被创建
我是主函数哦,我正在等待线程完成任务阿,呵呵
thread1 : I'm thread 1
thread1 : number = 0
thread2 : I'm thread 2
thread2 : number = 1
thread1 : number = 2
thread2 : number = 3
thread1 : number = 4
thread2 : number = 5
thread1 : number = 6
thread1 : number = 7
thread2 : number = 8
thread1 : number = 9
thread2 : number = 10
thread1 :主函数在等我完成任务吗?
线程1已经结束
thread2 :主函数在等我完成任务吗?
线程2已经结束
实例代码里头的注释应该比较清楚了吧,下面我把网路上介绍上面涉及到的几个函数和变量给引用过来。
引文:
线程相关操作
一 pthread_t
pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义:
typedef unsigned long int pthread_t;
它是一个线程的标识符。
二 pthread_create
函数pthread_create用来创建一个线程,它的原型为:
extern int pthread_create __P ((pthread_t *__thread, __const pthread_attr_t *__attr,
void *(*__start_routine) (void *), void *__arg));
第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。这里,我们的函数thread不需要参数,所以最后一个参数设为空指针。第二个参数我们也设为空指针,这样将生成默认属性的线程。对线程属性的设定和修改我们将在下一节阐述。当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了c多线程编程实战源码;后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。
三 pthread_join pthread_exit
函数pthread_join用来等待一个线程的结束。函数原型为:
extern int pthread_join __P ((pthread_t __th, void **__thread_return));
第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调用它的线程也就结束了;另一种方式是通过函数pthread_exit来实现。它的函数原型为:
extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__));
唯一的参数是函数的返回代码,只要pthread_join中的第二个参数thread_return不是NULL,这个值将被传递给 thread_return。最后要说明的是,一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join的线程则返回错误代码ESRCH。
在这一节里,我们编写了一个最简单的线程,并掌握了最常用的三个函数pthread_create,pthread_join和pthread_exit。下面,我们来了解线程的一些常用属性以及如何设置这些属性。
互斥锁相关
互斥锁用来保证一段时间内只有一个线程在执行一段代码。
一 pthread_mutex_init
函数pthread_mutex_init用来生成一个互斥锁。NULL参数表明使用默认属性。如果需要声明特定属性的互斥锁,须调用函数 pthread_mutexattr_init。函数pthread_mutexattr_setpshared和函数 pthread_mutexattr_settype用来设置互斥锁属性。前一个函数设置属性pshared,它有两个取值, PTHREAD_PROCESS_PRIVATE和PTHREAD_PROCESS_SHARED。前者用来不同进程中的线程同步,后者用于同步本进程的不同线程。在上面的例子中,我们使用的是默认属性PTHREAD_PROCESS_ PRIVATE。后者用来设置互斥锁类型,可选的类型有PTHREAD_MUTEX_NORMAL、PTHREAD_MUTEX_ERRORCHECK、 PTHREAD_MUTEX_RECURSIVE和PTHREAD _MUTEX_DEFAULT。它们分别定义了不同的上所、解锁机制,一般情况下,选用最后一个默认属性。
二 pthread_mutex_lock pthread_mutex_unlock pthread_delay_np
pthread_mutex_lock声明开始用互斥锁上锁,此后的代码直至调用pthread_mutex_unlock为止,均被上锁,即同一时间只能被一个线程调用执行。当一个线程执行到pthread_mutex_lock处时,如果该锁此时被另一个线程使用,那此线程被阻塞,即程序将等待到另一个线程释放此互斥锁。
注意:
1 需要说明的是,上面的两处sleep不光是为了演示的需要,也是为了让线程睡眠一段时间,让线程释放互斥锁,等待另一个线程使用此锁。下面的参考资料1里头说明了该问题。但是在linux下好像没有pthread_delay_np那个函数(我试了一下,提示没有定义该函数的引用),所以我用了sleep来代替,不过参考资料2中给出另一种方法,好像是通过pthread_cond_timedwait来代替,里头给出了一种实现的办法。
2 请千万要注意里头的注释comment1-5,那是我花了几个小时才找出的问题所在。
如果没有comment1和comment4,comment5,将导致在pthread_join的时候出现段错误,另外,上面的comment2和comment3是根源所在,所以千万要记得写全代码。因为上面的线程可能没有创建成功,导致下面不可能等到那个线程结束,而在用pthread_join的时候出现段错误(访问了未知的内存区)。另外,在使用memset的时候,需要包含string.h头文件哦
c语言如何编写一个简单的多线程程序?
这是一个多线程例子,里面只有两个线程,是生产者/消费者模式,已编译通过,注释很详细,
如下:
/* 以生产者和消费者模型问题来阐述Linux线程的控制和通信你
生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。
缓冲区有N个,是一个环形的缓冲池。
#include stdio.h
#include pthread.h
#define BUFFER_SIZE 16
struct prodcons
int buffer[BUFFER_SIZE];/*实际存放数据的数组*/
pthread_mutex_t lock;/*互斥体lock,用于对缓冲区的互斥操作*/
int readpos,writepos; /*读写指针*/
pthread_cond_t notempty;/*缓冲区非空的条件变量*/
pthread_cond_t notfull;/*缓冲区未满 的条件变量*/
/*初始化缓冲区*/
void pthread_init( struct prodcons *p)
pthread_mutex_init(p-lock,NULL);
pthread_cond_init(p-notempty,NULL);
pthread_cond_init(p-notfull,NULL);
p-readpos = 0;
p-writepos = 0;
/*将产品放入缓冲区,这里是存入一个整数*/
void put(struct prodcons *p,int data)
pthread_mutex_lock(p-lock);
/*等待缓冲区未满*/
if((p-writepos +1)%BUFFER_SIZE ==p-readpos)
pthread_cond_wait(p-notfull,p-lock);
p-buffer[p-writepos] =data;
p-writepos++;
if(p-writepos = BUFFER_SIZE)
p-writepos = 0;
pthread_cond_signal(p-notempty);
pthread_mutex_unlock(p-lock);
/*从缓冲区取出整数*/
int get(struct prodcons *p)
int data;
pthread_mutex_lock(p-lock);
/*等待缓冲区非空*/
if(p-writepos == p-readpos)
pthread_cond_wait(p-notempty ,p-lock);//非空就设置条件变量notempty
/*读书据,移动读指针*/
data = p-buffer[p-readpos];
p-readpos++;
if(p-readpos == BUFFER_SIZE)
p-readpos = 0;
/*设置缓冲区未满的条件变量*/
pthread_cond_signal(p-notfull);
pthread_mutex_unlock(p-lock);
return data;
/*测试:生产站线程将1 到1000的整数送入缓冲区,消费者线程从缓冲区中获取整数,两者都打印信息*/
#define OVER (-1)
struct prodcons buffer;
void *producer(void *data)
int n;
for( n=0;n1000;n++)
printf("%d ------\n",n);
put(buffer,n);
put(buffer,OVER);
return NULL;
void *consumer(void *data)
int d;
while(1)
d = get(buffer);
if(d == OVER)
break;
else
printf("-----%d\n",d);
return NULL;
int main()
pthread_t th_p,th_c;
void *retval;
pthread_init(buffer);
pthread_create(th_p,NULL,producer,0);
pthread_create(th_c,NULL,consumer,0);
/*等待两个线程结束*/
pthread_join(th_p, retval);
pthread_join(th_c,retval);
return 0;
C语言,windows多线程编程
点量Http、FTP多线程断点续传下载组件(下载DLL)的开发目的是让用户可以无需关心Http/FTP协议的具体细节,只需要几十行甚至几行代码,便可以实现一个功能完善的Http/FTP下载软件。点量Http/FTP下载组件(DLL)支持多线程、断点续传、显示详细下载过程、自动查找镜像网址、支持代理传输等完善的功能。
点量Http、FTP下载内核源码使用高效的c++代码编写,提供标准的动态链接库(DLL),可供C/C++、Delphi、C#、Java、VB等语言和各常用开发环境调用,让您完全像调用系统API一样的调用。
点量Http/FTP组件的功能简介:
标准Http和FTP下载支持:完全标准的Http和FTP协议支持,内部通过网址自动区分是Http还是FTP下载。
极速下载(2.0以后版本):超越国内绝大多数下载软件的下载速度。新版内核在2M ADSL的环境下下载,有些文件的速度可以达到1400K字节/秒以上,超过了带宽的极限。下载速度可以用极速形容。
多线程传输:可以将文件自动分块,并采用多线程下载。并可自由设置线程数目。
断点续传:点量Http/FTP有优秀的断点续传支持,每次启动自动从上次下载的位置开始,不需要重复下载。
提供详细的下载详情接口(2.0以后版本):可以看到整个下载过程的步骤,比如开启了多少线程、服务器的应答过程、错误信息等。
支持多种高级设置:设置线程数目、磁盘缓存大小、搜索镜像服务器的详细参数设置、下载文件完成后同步文件为服务器上的文件时间、下载过程中可以自定义文件临时后缀、未完成的文件设为隐藏属性。
支持磁盘缓存:点量Http/FTP下载DLL支持设置磁盘缓存,减少对磁盘的读写,并提升下载速度。
支持设置Refer:点量Http/FTP下载组件支持设置下载时的Refer,以便可以绕过一些防盗链的网站,直接下载内容。
限速功能:点量Http/FTP下载组件可方便的设置下载限速。
多种磁盘分配方式:点量Http/FTP下载组件支持预分配和边下载边分配两种磁盘方式,满足多种下载需求。
自动搜索镜像加速:点量Http/FTP内置了镜像搜索功能,在下载文件的同时,会自动搜索哪些其它网站还有这个文件,自动从其它网址下载加速。
可提供源码:支付一定的费用,便可以获得全部的点量Http/FTP下载组件的源代码,免除您的所有后顾之忧。
良好的服务:作为点量软件旗下的软件,可享受到点量软件的优秀服务,我们的服务让您如同拥有一个称心的专业员工。
点量Http/FTP 下载组件可以适用于任何Http和FTP下载的领域,让您可以在1天内完成一个完整的Http下载软件的全部功能。比如,您可以用于产品的升级、文件的下载和传输等。
点量Http/FTP内核可以为您带来:
1、大大节省您的开发成本:了解Http和FTP的协议,再去编码、测试,即使对于一个非常有经验的开发人员来说,也需要较长期的时间,此间耗费的人力资源成本和管理成本可谓不少。而使用点量Http/FTP,您就不需要从制造轮子开始制造您的汽车,将注意力集中于车的设计而不是基础设备的建设。何况我们的产品性能是如此优越!
2、强有力的技术支持:作者长期从事下载技术的研发,所提供的技术支持相当于您雇佣了一位具有丰富经验,无需从头学习的开发人员,可以在您的系统建设过程中为您提供整体系统架设的意见。
如果您是个人作为非商业目的使用,您可以自由、免费的使用点量Http/FTP下载组件内核库和演示程序,也期待收到您反馈的意见和建议;如果您是商业使用,那么您需要联系作者申请产品的商业授权。
编写一个多线程的C程序 分割数据并分发给每个线程
不如贴英文原版要求c多线程编程实战源码,中文翻译出来c多线程编程实战源码的要求看着不是很明白
急求!!多线程生产者消费者问题的c语言程序,要源码、已在linux中执行过的文件,最好有截图!!
#include sys/types.h
#include sys/ipc.h
#include sys/shm.h
#include stdio.h
#include semaphore.h
#include sys/types.h
#include sys/stat.h
#include fcntl.h
#include stdlib.h
#include unistd.h
#include sys/mman.h
#include sys/time.h
#includestring.h
#define BUFSIZE 4096
#define SEM_IN_TASK "INX_TASK"
#define SEM_OUT_TASK "OUTX_TASK"
sem_t *sem_in;
sem_t *sem_out;
main(int argc, char** argv) // map a normal file as shared mem:
int fd,i;
char *p_map;
char temp;
fd=open(argv[1],O_CREAT|O_RDWR|O_TRUNC,00777);
//lseek(fd,sizeof(people)*5-1,SEEK_SET);
write(fd,"",1);
p_map = (char*) mmap( NULL,BUFSIZE,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0 );//建立共享内存
close( fd );
sem_unlink(SEM_IN_TASK);
sem_unlink(SEM_OUT_TASK);
sem_in = sem_open(SEM_IN_TASK,O_CREAT|O_EXCL,0644,1); //1ok
sem_out=sem_open(SEM_OUT_TASK,O_CREAT|O_EXCL,0644,0); //0ok
printf("[sem_in] [%d]\n",sem_in);
printf("[sem_out] [%d]\n",sem_out);
if(sem_in == SEM_FAILED||sem_out == SEM_FAILED)
perror("wangsha-unable to create semaphore");
sem_unlink(SEM_IN_TASK);
sem_unlink(SEM_OUT_TASK);
exit(-1);
memset(p_map,0,BUFSIZE);
while(1)
//printf("---------A waitting B-----------\n\n\n\n");
sem_wait(sem_out);
printf("A:%s\n",p_map );
memset(p_map,'a',100);
sem_post(sem_in);
//printf("------------A emit B-----------\n\n\n\n");
munmap( p_map, BUFSIZE );
printf( "umap ok \n" );
#include sys/mman.h
#include sys/types.h
#include fcntl.h
#include unistd.h
#include sys/types.h
#include sys/ipc.h
#include sys/shm.h
#include stdio.h
#include semaphore.h
#include sys/types.h
#include sys/stat.h
#include fcntl.h
#include stdlib.h
#include unistd.h
#include sys/mman.h
#include sys/time.h
#includestring.h
#define SEM_IN_TASK "INX_TASK"
#define SEM_OUT_TASK "OUTX_TASK"
#define BUFSIZE 4096
sem_t *sem_in;
sem_t *sem_out;
main(int argc, char** argv) // map a normal file as shared mem:
int fd =-1;
int i= 0;
char *p_map;
double consumetime = 0.0;
struct timeval process_stat , process_end;
fd=open( argv[1],O_CREAT|O_RDWR,00777 );
p_map = (char*)mmap(NULL,BUFSIZE,PROT_READ|PROT_WRITE, MAP_SHARED,fd,0);
sem_in = sem_open(SEM_IN_TASK,O_CREAT,0644,0); //0ok
sem_out=sem_open(SEM_OUT_TASK,O_CREAT,0644,1); //1ok
printf("[sem_in] [%d]\n",sem_in);
printf("[sem_out] [%d]\n",sem_out);
if(sem_in == SEM_FAILED||sem_out == SEM_FAILED)
perror("unable to create semaphore-wang");
sem_unlink(SEM_OUT_TASK);
sem_unlink(SEM_IN_TASK);
exit(-1);
memset(p_map,0,BUFSIZE);
//gettimeofday(process_stat,NULL);
//while(1)
for(i =0;i50000;i++)
memset(p_map,'b',100);
//printf("------------B emit A-----------\n\n\n\n");
sem_post(sem_out);
usleep(200);
sem_wait(sem_in);
//printf("------------A emit B-----------\n\n\n\n");
printf( "B:%s\n",p_map );
//gettimeofday(process_end,NULL);
//consumetime = (double)(process_end.tv_sec - process_stat.tv_sec)*1e6 +(double)(process_end.tv_usec - process_stat.tv_usec)/1e6;
//printf("consumetime:[%f]\n",consumetime);
munmap( p_map,BUFSIZE );
如果对你有帮助,请给分哦,谢谢!
c语言 多线程套接字编程
#include stdlib.h
#include stdio.h
#include errno.h
#include string.h
#include sys/types.h
#include netinet/in.h
#include sys/wait.h
#include sys/socket.h
#define PORT 5000 // The port which is communicate with server
#define BACKLOG 10
#define LENGTH 512 // Buffer length
int main ()
{ int sockfd; // Socket file descriptor
int nsockfd; // New Socket file descriptor
int num;
int sin_size; // to store struct size
char sdbuf[LENGTH]; // Send buffer
struct sockaddr_in addr_local;
struct sockaddr_in addr_remote;
char sendstr[16]= {"123456789 abcde"};
/* Get the Socket file descriptor */
if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
printf ("ERROR: Failed to obtain Socket Despcritor.\n");
return (0);
else
printf ("OK: Obtain Socket Despcritor sucessfully.\n");
/* Fill the local socket address struct */
addr_local.sin_family = AF_INET; // Protocol Family
addr_local.sin_port = htons(PORT); // Port number
addr_local.sin_addr.s_addr = INADDR_ANY; // AutoFill local address
bzero((addr_local.sin_zero), 8); // Flush the rest of struct
/* Blind a special Port */
if( bind(sockfd, (struct sockaddr*)addr_local, sizeof(struct sockaddr)) == -1 )
printf ("ERROR: Failed to bind Port %d.\n",PORT);
return (0);
else
printf("OK: Bind the Port %d sucessfully.\n",PORT);
/* Listen remote connect/calling */
if(listen(sockfd,BACKLOG) == -1)
printf ("ERROR: Failed to listen Port %d.\n", PORT);
return (0);
else
printf ("OK: Listening the Port %d sucessfully.\n", PORT);
while(1)
sin_size = sizeof(struct sockaddr_in);
/* Wait a connection, and obtain a new socket file despriptor for single connection */
if ((nsockfd = accept(sockfd, (struct sockaddr *)addr_remote, sin_size)) == -1)
printf ("ERROR: Obtain new Socket Despcritor error.\n");
continue;
else
printf ("OK: Server has got connect from %s.\n", inet_ntoa(addr_remote.sin_addr));
/* Child process */
if(!fork())
printf("You can enter string, and press 'exit' to end the connect.\n");
while(strcmp(sdbuf,"exit") != 0)
scanf("%s", sdbuf);
if((num = send(nsockfd, sdbuf, strlen(sdbuf), 0)) == -1)
printf("ERROR: Failed to sent string.\n");
close(nsockfd);
exit(1);
printf("OK: Sent %d bytes sucessful, please enter again.\n", num);
close(nsockfd);
while(waitpid(-1, NULL, WNOHANG) 0);
C语言基础网络编程求助 如何实现多线程
#include sys/stat.h
#include fcntl.h
#include errno.h
#include netdb.h
#include sys/types.h
#include sys/socket.h
#include netinet/in.h
#include arpa/inet.h
#include string.h
#include stdlib.h
#include stdio.h
#include unistd.h
#include pthread.h
void*thread(void*);
int client[5],i;
main()
int serverSocket= socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in server_addr;
struct sockaddr_in clientAddr;
int addr_len = sizeof(clientAddr);
//线程
pthread_t id;
pthread_attr_t attr;
pthread_attr_init(attr);////////////////////////////////////////////////
pthread_attr_setdetachstate(attr,PTHREAD_CREATE_DETACHED);
//创建地址
bzero(server_addr,sizeof(server_addr));
server_addr.sin_family =AF_INET;
server_addr.sin_port = htons(5555);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//绑定
bind(serverSocket,(struct sockaddr *)server_addr,sizeof(server_addr));
listen(serverSocket,5);
for(i=0;i5;i++)
client[i] = accept(serverSocket,(struct sockaddr *)clientAddr,(socklen_t*)addr_len);
pthread_create(id,attr,thread,(void *)client[i]);/////////////////////////////////
pthread_join(id,NULL);
close(serverSocket);/////////////////////////
return 0;
void* thread(void* argv)
char buffer[200];
int a=i;
int s_c = *((int*)argv);///////////////////
while(1)
int n = recv(s_c,buffer,sizeof(buffer),0);
if(n 0)
printf("客户端发过来的 : %s\n",buffer);
else
return;
close(s_c);