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

主要是使用多线程去等待接受数据和发送数据。以下是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. BZOJ 2073

    思路: 状压DP  枚举子集 //By SiriusRen #include <cstdio> #include <cstring> #include <algorith ...

  2. History of the browser user-agent string--转

    https://webaim.org/blog/user-agent-string-history/ In the beginning there was NCSA Mosaic, and Mosai ...

  3. MemCached总结二:数据管理指令

    管理memcached中的数据包括添加(add).修改(set).删除(delete)及获取(get)等操作. 命令格式: 1.set set userId 0 0 5 12345 STORED ge ...

  4. windows server 2008 R2开机进度条闪过后黑屏

    起因:想在2008中添加hyper-v角色 事件经过: 1.在服务器管理器中添加hyper-v角色,重启,一直配置失败. 2.在bios开启vt-x,重新添加hyper-v角色,重启,进度条闪一下之后 ...

  5. linux+nginx+python+django环境配置

    Django是一个开放源代码的Web应用框架,由Python写成,它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的.python+django也是web开发者最受欢迎的框架.今天 ...

  6. Vs2010无法打开文件“Kernel32.lib”、无法打开“libcpmt.lib”"msvcprt.lib"

    1.对于无法打开"Kernel"问题,即使复制lib文件到目录,仍然会出现最后的错误; 原因:WindowsSdk 安装失败! 方法:重装 microsoft SDK6.0 ,再在 ...

  7. Rx (Reactive Extensions)介绍

    Reactive Extensions (Rx) 原来是由微软提出的一个综合了异步和基于事件驱动编程的库包,使用可观察序列和LINQ-style查询操作. 使用Rx, 开发者可以用Observable ...

  8. 带你认识闻名遐迩的ZBrush

    ZBrush®是一款数字雕刻和绘画软件,它以其强大的功能和直观的工作流程彻底改变了3D行业.ZBrush 4R8是目前最新版本,它秉持一贯的简洁界面风格,给如今的数字艺术工作者提供了世界领先的工具.它 ...

  9. 转载:html特殊字符 编码css3 content:&amp;quot;我是特殊符号&amp;quot;

    项目中用到的一些特殊字符和图标 html代码 <div class="cross"></div> css代码 .cross{ width: 20px; he ...

  10. Java将数据以Excel文件形式导出后台代码实现

    下面代码实现所需jar包: tomcat-embed-core-8.5.11.jar: commons-lang3-3.0.1.jar: commons-io-2.5.jar: poi-3.9.jar ...