服务器

/* socket server
* 2014-12-15 CopyRight (c) arbboter
*/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <string.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <vector>
using namespace std; vector<int> vecClient;
// 线程同步锁
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void* recv_thr(void*p);
void* send_thr(void*p);
int main()
{
int sockfd_server;
int sockfd_client;
struct sockaddr_in addr_server;
struct sockaddr_in addr_client;
socklen_t addr_len = ;
int client_max = ;
int server_port = ; srand(time(NULL)); // create socket
sockfd_server = socket(AF_INET, SOCK_STREAM, );
if(sockfd_server == -)
{
printf("init socket failed\n");
return -;
} // set address
memset(&addr_server, , sizeof(addr_server));
addr_server.sin_family = AF_INET;
addr_server.sin_addr.s_addr = htonl(INADDR_ANY);
addr_server.sin_port = htons(server_port); // socket bind with address
if(bind(sockfd_server, (struct sockaddr*)&addr_server, sizeof(struct sockaddr)) == -)
{
printf("bind socket failed\n");
return -;
} // server socket start list, waitting client to connect
// 这个client_max是指同时连接数
if(listen(sockfd_server, client_max) == -)
{
printf("start listen socket failed\n");
return -;
} // 数据线程
pthread_t tid = ; pthread_create(&tid, NULL, send_thr, NULL);
while()
{
addr_len = sizeof(struct sockaddr_in);
printf("waitting for connected...\n"); // waitting for connected
sockfd_client = accept(sockfd_server, (struct sockaddr*)&addr_client, &addr_len);
if(sockfd_client == -)
{
printf("accept socket failed\n");
return -;
} // create a thread to talk with client
printf("recived connection from : %s\n", inet_ntoa(addr_client.sin_addr));
pthread_create(&tid, NULL, recv_thr, (void*)&sockfd_client); // 加到发数据对象集合中
pthread_mutex_lock(&mutex);
vecClient.push_back(sockfd_client);
pthread_mutex_unlock(&mutex);
}
close(sockfd_server);
pthread_mutex_destroy(&mutex);
return ;
} // 收数据
void* recv_thr(void*p)
{
int fd = *((int*)p);
int nRead = ;
char szBuf[] = {}; while()
{
memset(szBuf, , sizeof(szBuf));
nRead = read(fd, szBuf, sizeof(szBuf));
printf("client : %s\n", szBuf); if(strcmp(szBuf, "quit") == )
{
break;
} sprintf(szBuf, "Your magic number is : %d", rand()%);
printf("server : %s\n", szBuf);
write(fd, szBuf, strlen(szBuf));
}
return NULL;
} // 发数据
void* send_thr(void*p)
{
size_t i = ;
char szBuf[] = {}; while()
{
sleep(rand()%);
pthread_mutex_lock(&mutex);
for(int i=; i<vecClient.size(); i++)
{
sprintf(szBuf, "Your magic number is : %d", rand()%);
printf("[%02d] server : %s\n", i, szBuf);
write(vecClient[i], szBuf, strlen(szBuf));
}
pthread_mutex_unlock(&mutex);
}
return NULL;
}

客户端

/* socket client
* 2014-12-15 CopyRight (c) arbboter
*/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <string.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <signal.h>
#include <errno.h>
#include <string.h> void* recv_thr(void*p);
int main()
{
int sockfd_server;
struct sockaddr_in addr_server;
socklen_t addr_len = ;
int server_port = ;
char* server_addr = "192.168.2.200"; // create socket
sockfd_server = socket(AF_INET, SOCK_STREAM, );
if(sockfd_server == -)
{
printf("init socket failed\n");
return -;
} // set server address
memset(&addr_server, , sizeof(addr_server));
addr_server.sin_family = AF_INET;
addr_server.sin_addr.s_addr = inet_addr(server_addr);;
addr_server.sin_port = htons(server_port); // connect server
if(connect(sockfd_server,(struct sockaddr *)&addr_server,sizeof(struct sockaddr))==-)
{
printf("connect server failed\n");
return -;
} // 启动收数据线程
pthread_t tid = ;
pthread_create(&tid, NULL, recv_thr, (void*)&sockfd_server); // 发送数据
char szBuf[] = {};
int nLen = ;
while()
{
// 收线程已退出
if( ESRCH == pthread_kill(tid,) )
{
break;
}
// 等待输入数据
gets(szBuf);
nLen = strlen(szBuf);
if(nLen > )
{
szBuf[nLen] = '\0';
write(sockfd_server, szBuf, nLen);
}
}
close(sockfd_server);
return ;
} // 收数据
void* recv_thr(void*p)
{
int fd = *((int*)p);
int nRead = ;
char szBuf[] = {}; while()
{
memset(szBuf, , sizeof(szBuf));
nRead = read(fd, szBuf, sizeof(szBuf));
printf("server : %s\n", szBuf); if(strcmp(szBuf, "quit") == )
{
break;
}
}
return NULL;
}

Linux下使用多线程模拟异步网络通信的更多相关文章

  1. 【转】 Linux下的多线程编程

    作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/原文链接:http://www.cnblogs.com/gnuhpc/archive/2012/12/07/280 ...

  2. Linux下的多线程编程

    1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(proces ...

  3. 【转】Linux下的多线程编程

    1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(proces ...

  4. 《转》Linux下的多线程编程

    原地址:http://linux.chinaunix.net/doc/program/2001-08-11/642.shtml 1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程 ...

  5. linux下php pcntl_fork模拟多线程

    开始用php写后台服务一段时间了.也是在这样的驱动下,不断的学习php语法,体验这一原来一直以为神秘且敬而远之的神奇语言的魅力.最初看php多线程的资料是为了提高程序的处理能力,充分发挥linux多任 ...

  6. Linux下基于多线程的echo

    准备开始写一些Linux 下网络编程以及多线程的blog,就从这个简单的echo程序开始吧. 在echo的服务端使用多线程与客户进行通信,可以实现一个服务端程序同时连接多个客户的功能.那么,到底在服务 ...

  7. linux下的多线程,pthread_create函数

    pthread_create是UNIX环境创建线程函数 头文件 #include<pthread.h> 函数声明 int pthread_create(pthread_t*restrict ...

  8. 【转】Linux下的多线程编程背景知识

    1. 进程和线程 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(pr ...

  9. linux下使用多线程编写的聊天室

    自从开始学linux网络编程后就想写个聊天室,一开始原本打算用多进程的方式来写,可是发觉进程间的通信有点麻烦,而且开销也大,后来想用多线程能不能实现呢,于是便去看了一下linux里线程的用法,实际上只 ...

随机推荐

  1. js实现网页收藏功能,动态添加删除网址

    <html> <head> <title> 动态添加删除网址 </title> <meta charset="utf-8"&g ...

  2. python修改txt文件内容

    ①以r模式打开文件并用readlines方法读入列表l中 ②修改相关行,直接用l[n]形式即可 ③关闭文件 ④以w方式打开文件,用writelines方法写入文件(覆盖文件内容) ⑤关闭文件 需要注意 ...

  3. 消息机制2 - Windows程序设计(SDK)005

    消息机制2 让编程改变世界 Change the world by program 内容节选: 关于消息机制,还有三点需要补充: 消息队列是FIFO的形式 WM_PAINT,WM_TIMER 和 WM ...

  4. laravel实现发送qq邮件

    首先修改config/mail.php 'from' => [ 'address' => 'hello@example.com', 'name' => 'Example', ], 修 ...

  5. nodejs javascript微信开发

    1.当从第三方软件需要分享到微信的时候 需要给授权处理才能获得微信信息 比如 nickname 等昵称图像等 从第三方登陆跳转到微信分享页需要 shareurl = http://open.weixi ...

  6. Swift 总结使用问号(?)和感叹号(!)-备用

    在使用可选类型和可选链时,多次使用了问号(?)和感叹号(!),但是它们的含义是不同的,下面我来详细说明一下. 1. 可选类型中的问号(?) 声明这个类型是可选类型,访问这种类型的变量或常量时要使用感叹 ...

  7. 在eclipse中创建web项目

    如何创建dynamic web project项目 本文的演示是从本地文件创建dynamic web project,从svn检出的同时创建dynamic web project于此类似.我们推荐使用 ...

  8. zabbix报警把特定的应用集发送给developer

    1.创建新的action 2.创建新的develop用户 3.需要删除组不然会给组里所有人发

  9. 回收带Lob字段表占用的空间

    SQL> select object_name from user_objects; no rows selected SQL> select segment_name from user ...

  10. UBI(unsorted block image )块管理

    一.介绍 ubi是unsorted block images的缩写,是由IBM开发设计的,它与ubifs有不同的含义,ubifs是一种文件系统(nokia开发的):而ubi是一种块管理工具,工作在mt ...