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

主要是使用多线程去等待接受数据和发送数据。以下是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. 在ubuntu中安装Markdown神器Typora

    title: 在ubuntu中安装Markdown神器Typora toc: false date: 2018-09-01 17:48:15 categories: methods tags: ubu ...

  2. Solr.NET快速入门(八)【多核多实例,映射验证】

    多核/多实例 本页介绍如何配置SolrNet访问(读/写)多个Solr内核或实例. 它假定您知道Solr内核是什么,如何在SolrNet外部配置和使用它们. 此页面不涵盖CoreAdminHandle ...

  3. 文档控件NTKO OFFICE 详细使用说明之预览PDF文件(禁止打印、下载、另存为、防抓包下载)

    1.在线预览PDF文件(禁止打印.下载.复制.另存为) (1) 运行环境 ① 浏览器:支持IE7-IE11(平台版本还支持Chrome和Firefox) ② IE工具栏-Internet 选项:将ww ...

  4. 第4章 部署模式 Deployment Plan(部署规划)

    已开发了基于组件的应用程序,该应用程序在逻辑上构造为多层结构,如 Three-Layered Services Application. 中所述.您希望将它分布到一组在物理上为多级结构的服务器上,如 ...

  5. STL:使用string、vector、complex和limits

    (有少量修改!)使用到了STL的算法库: #include<algorithm> #include<vector> //属于STL库 模板库 写库的人为了和标准C和C++库区分 ...

  6. vue项目中引用echarts的几种方式

    准备工作: 首先我们初始化一个vue项目,执行vue init webpack echart,接着我们进入初始化的项目下.安装echarts, npm install echarts -S //或   ...

  7. 07 --C语言字符串函数

    1)字符串操作  复制 strcpy(p, p1)      复制字符串 strncpy(p, p1, n)  复制指定长度字符串 strdup(char *str)      将串拷贝到新建的位置处 ...

  8. 脚本_部署LNMP平台

    #!bin/bash#功能:部署LNMP平台,实际运行脚本时,需要去除备注.#作者:liusingbonfunction menu {                //定义函数menu        ...

  9. Python——Day2(笔记代码)

    # test = "大pandaboy"# v=test.capitalize()#首字母大写,当为汉字时失效# print(v)######################### ...

  10. C#学习 第六节

    什么是类型(Type)? 类型在C#中的作用 C#语言的类型系统 变量.对象与内存 类型(Type):数据类型 性质相同的值得集合:内存:内部存储单元,计算机运行程序的空间:外存:扩展存储器,硬盘: ...