不怎么会弄这个博客的排版,就直接将代码附上:

主要是使用多线程去等待接受数据和发送数据。以下是client的代码:

tcpsed.h文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef RTPSED_H
#define RTPSED_H
#define BUFFSIZE 512
int runcond;
int socketfd;
typedef struct TCP_send_arg
{
char *tcpserver_addr;
int tcp_port;
}TCP_send_arg_t;
void tcp_stophandler(int signum);
void *tcppacketsend(void *arg);
void quit(int signum);
#endif

tcpsed.c文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include "tcpsed.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/param.h>
#include <arpa/inet.h>
#include <errno.h>
#include <signal.h>
#include <fcntl.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <pthread.h>
int socketfd;
void tcp_stophandler(int signum)
{
runcond = 0;
}
void quit(int signum)
{
close(socketfd);
printf("Bye~Bye!\n");
pthread_exit(NULL);
}
void *pth_read(void *arg)
{
int runcond = 1;
int result;
char pth_buf[BUFFSIZE];
while(runcond)
{
if(0 > (result = read(socketfd,pth_buf,BUFFSIZE - 1)))
{
fprintf(stderr,"Read Error:%s\n",strerror(errno));
}
pth_buf[result] = '\0';
printf("%s\n",pth_buf);
}
pthread_exit(NULL);
}
void *tcppacketsend(void *arg)
{
runcond = 1;
struct sockaddr_in server_addr;
char buf[BUFFSIZE] = {0};
int connfd;
pthread_t tid;
TCP_send_arg_t *send_arg = (TCP_send_arg_t *)arg;
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons((*send_arg).tcp_port);
server_addr.sin_addr.s_addr = inet_addr((*send_arg).tcpserver_addr);
if(-1 == (socketfd = socket(AF_INET,SOCK_STREAM,0)))
{
fprintf(stderr,"Socket Error:%s\n",strerror(errno));
pthread_exit(NULL);
}
if(-1 == (connfd = connect(socketfd,(struct sockaddr*)&server_addr,sizeof(server_addr))))
{
fprintf(stderr,"Connect Error:%s\n",strerror(errno));
pthread_exit(NULL);
}
printf("You can use \"Ctrl + D\" to quit.\n");
if(SIG_ERR == signal(SIGUSR1,quit))
{
fprintf(stderr,"Can't set SIGUSR1 signal action!\n");
pthread_exit(NULL);
}
if(0 != pthread_create(&tid,NULL,(void *)pth_read,(void *)buf))
{
fprintf(stderr,"Create pthread Error:%s\n",strerror(errno));
pthread_exit(NULL);
}
while(NULL != (fgets(buf,BUFFSIZE,stdin)))
{
write(socketfd,buf,strlen(buf) - 1);
}
pthread_cancel(tid);
pthread_exit(NULL);
}

client.c文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include "tcpsed.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/param.h>
#include <arpa/inet.h>
#include <errno.h>
#include <signal.h>
#include <fcntl.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <pthread.h>
int socketfd;
void tcp_stophandler(int signum)
{
runcond = 0;
}
void quit(int signum)
{
close(socketfd);
printf("Bye~Bye!\n");
pthread_exit(NULL);
}
void *pth_read(void *arg)
{
int runcond = 1;
int result;
char pth_buf[BUFFSIZE];
while(runcond)
{
if(0 > (result = read(socketfd,pth_buf,BUFFSIZE - 1)))
{
fprintf(stderr,"Read Error:%s\n",strerror(errno));
}
pth_buf[result] = '\0';
printf("%s\n",pth_buf);
}
pthread_exit(NULL);
}
void *tcppacketsend(void *arg)
{
runcond = 1;
struct sockaddr_in server_addr;
char buf[BUFFSIZE] = {0};
int connfd;
pthread_t tid;
TCP_send_arg_t *send_arg = (TCP_send_arg_t *)arg;
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons((*send_arg).tcp_port);
server_addr.sin_addr.s_addr = inet_addr((*send_arg).tcpserver_addr);
if(-1 == (socketfd = socket(AF_INET,SOCK_STREAM,0)))
{
fprintf(stderr,"Socket Error:%s\n",strerror(errno));
pthread_exit(NULL);
}
if(-1 == (connfd = connect(socketfd,(struct sockaddr*)&server_addr,sizeof(server_addr))))
{
fprintf(stderr,"Connect Error:%s\n",strerror(errno));
pthread_exit(NULL);
}
printf("You can use \"Ctrl + D\" to quit.\n");
if(SIG_ERR == signal(SIGUSR1,quit))
{
fprintf(stderr,"Can't set SIGUSR1 signal action!\n");
pthread_exit(NULL);
}
if(0 != pthread_create(&tid,NULL,(void *)pth_read,(void *)buf))
{
fprintf(stderr,"Create pthread Error:%s\n",strerror(errno));
pthread_exit(NULL);
}
while(NULL != (fgets(buf,BUFFSIZE,stdin)))
{
write(socketfd,buf,strlen(buf) - 1);
}
pthread_cancel(tid);
pthread_exit(NULL);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>
#include "tcpsed.h"
#define PORT 8888
#define IP "192.168.1.220"
TCP_send_arg_t send_arg;
int main(int argc,char *argv[])
{
pthread_t tid;
void *tret;
send_arg.tcp_port = PORT;
send_arg.tcpserver_addr = IP;
if(0 != pthread_create(&tid,NULL,(void *)tcppacketsend,(void *)&send_arg))
{
fprintf(stderr,"Create pthread error:%s\n",strerror(errno));
pthread_exit(NULL);
}
printf("OK!\n");
if(0 != pthread_join(tid,&tret))
{
fprintf(stderr,"Join thread error:%s\n",strerror(errno));
pthread_exit(NULL);
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include "tcpsed.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/param.h>
#include <arpa/inet.h>
#include <errno.h>
#include <signal.h>
#include <fcntl.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <pthread.h>
int socketfd;
void tcp_stophandler(int signum)
{
runcond = 0;
}
void quit(int signum)
{
close(socketfd);
printf("Bye~Bye!\n");
pthread_exit(NULL);
}
void *pth_read(void *arg)
{
int runcond = 1;
int result;
char pth_buf[BUFFSIZE];
while(runcond)
{
if(0 > (result = read(socketfd,pth_buf,BUFFSIZE - 1)))
{
fprintf(stderr,"Read Error:%s\n",strerror(errno));
}
pth_buf[result] = '\0';
printf("%s\n",pth_buf);
}
pthread_exit(NULL);
}
void *tcppacketsend(void *arg)
{
runcond = 1;
struct sockaddr_in server_addr;
char buf[BUFFSIZE] = {0};
int connfd;
pthread_t tid;
TCP_send_arg_t *send_arg = (TCP_send_arg_t *)arg;
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons((*send_arg).tcp_port);
server_addr.sin_addr.s_addr = inet_addr((*send_arg).tcpserver_addr);
if(-1 == (socketfd = socket(AF_INET,SOCK_STREAM,0)))
{
fprintf(stderr,"Socket Error:%s\n",strerror(errno));
pthread_exit(NULL);
}
if(-1 == (connfd = connect(socketfd,(struct sockaddr*)&server_addr,sizeof(server_addr))))
{
fprintf(stderr,"Connect Error:%s\n",strerror(errno));
pthread_exit(NULL);
}
printf("You can use \"Ctrl + D\" to quit.\n");
if(SIG_ERR == signal(SIGUSR1,quit))
{
fprintf(stderr,"Can't set SIGUSR1 signal action!\n");
pthread_exit(NULL);
}
if(0 != pthread_create(&tid,NULL,(void *)pth_read,(void *)buf))
{
fprintf(stderr,"Create pthread Error:%s\n",strerror(errno));
pthread_exit(NULL);
}
while(NULL != (fgets(buf,BUFFSIZE,stdin)))
{
write(socketfd,buf,strlen(buf) - 1);
}
pthread_cancel(tid);
pthread_exit(NULL);
}

Linux以下基于TCP多线程聊天室(client)的更多相关文章

  1. Linux以下基于TCP多线程聊天室(server)

    接上篇博文,本文是server端的实现,主要实现的功能,就是现实client的连接.转发client发送的消息.以及client掉线提示等功能,同一时候能够在这这上面扩展和TCP以及线程相关的功能木块 ...

  2. TCP多线程聊天室

    TCP协议,一个服务器(ServerSocket)只服务于一个客户端(Socket),那么可以通过ServerSocket+Thread的方式,实现一个服务器服务于多个客户端. 多线程服务器实现原理— ...

  3. Linux下c++11多线程聊天室

    刚看的c++11多线程,写个聊天室试试编译的时候加上 c++11 和 多线程库g++ -Wall -std=c++0x -pthread -o server server.cppserver 和cli ...

  4. Java 网络编程 -- 基于TCP 实现聊天室 群聊 私聊

    分析: 聊天室需要多个客户端和一个服务端. 服务端负责转发消息. 客户端可以发送消息.接收消息. 消息分类: 群聊消息:发送除自己外所有人 私聊消息:只发送@的人 系统消息:根据情况分只发送个人和其他 ...

  5. Linux下c语言TCP多线程聊天室

    开发环境:Linux,GCC 相关知识:TCP(博客:传送门),线程 附加:项目可能还有写不足之处,有些bug没调出来(如:对在线人数的控制),希望大佬赐教. 那么话不多说,放码过来: 码云:传送门, ...

  6. 基于Linux的TCP网络聊天室

    1.实验项目名称:基于Linux的TCP网络聊天室 2.实验目的:通过TCP完成多用户群聊和私聊功能. 3.实验过程: 通过socket建立用户连接并传送用户输入的信息,分别来写客户端和服务器端,利用 ...

  7. 【C++】基于socket的多线程聊天室(控制台版)

    以前学习socket网络编程和多线程编程的时候写的一个练手程序 聊天室基本功能: 1.用户管理:登录,注册,登出,修改用户名,修改密码 2.聊天室功能:群聊,私聊,获取在线用户列表,获取所有用户列表 ...

  8. 基于WebSocket实现聊天室(Node)

    基于WebSocket实现聊天室(Node) WebSocket是基于TCP的长连接通信协议,服务端可以主动向前端传递数据,相比比AJAX轮询服务器,WebSocket采用监听的方式,减轻了服务器压力 ...

  9. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

随机推荐

  1. [源码管理] Microsoft Visual SourceSafe 2005 下载与配置

    一.VSS2005的下载地址是:百度搜索关键字:vss, 二.配置Microsoft Visual SourceSafe 2005的Internet访问 VSS2005发布以后,早就听说可以支持Int ...

  2. php获取前天的昨天的日期

    在PHP里得到前天和昨天的日期的代码前天去面试的时候也是这样,不过我当时记不起来了.就记得MYSQL里面的date_sub(now(),'interval 1 day');date('Y/m/d h: ...

  3. UVA-10347 Medians 计算几何 中线定理

    题面 题意:已知三角形三中线的长度nmp,求面积 题解:如果知道中线定理就比较简单了 三边长为 3*a=sqrt(8*mb*mb+8*mc*mc-4*ma*ma) 3*b=sqrt(8*ma*ma+8 ...

  4. Linux下实现视频读取

    V4L(video4linux是一些视频系统,视频软件.音频软件的基础,经常时候在需要采集图像的场合,如视频监控,webcam,可视电话,经常使用在embedded linux中是linux嵌入式开发 ...

  5. vue-cli 安装

    1    node 下载      http://nodejs.cn/download/ 安装 2  npm install vue-cli -g 3  vue init <template-n ...

  6. echarts 纵坐标数字太长显示补全,以及文字倾斜显示

    如上数字太长,显示补全,以及x坐标的月份当数量大的时候也会显示补全: x可以调节纵坐标label的宽度 y2可以调节横坐标label的高度 grid: { x: 100, //默认是80px y: 6 ...

  7. java并发的一些杂乱小结

    1.java语言本身就提供了多线程机制,这样即使在单任务的操作系统上也可以实现多线程,这也是java语言本身"编写一次,到处运行"的特性. 2.并发要解决的问题本质上是:多个线程同 ...

  8. 版本控制之git学习

    最近学习了一下版本控制中比较符合开发者气质的Git,这里做一个总结.一来梳理所学的内容:二来也作为起点后续继续丰富.学习的方式主要为网络学习和个人实践.推荐两个学习网页,互相参考必有所成. 博客园:h ...

  9. Windows Server菜鸟宝典之一:Windows Server 2008 R2 AD服务器搭建

        1.对于将要安装成为DC的服务器来讲,其系统配置以及基本的磁盘规划在此就不在累述了,但是关键的网络连接属性是必须要注意的.可以通过打开本地连接的属性来进行配置其IP属性.作为服务器DC的IP地 ...

  10. Python笔记13------pandas作图

    1.pandas可以用来画DataFrame和Series的图 如: import numpy as npimport matplotlib.pyplot as pltimport pandas as ...