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

主要是使用多线程去等待接受数据和发送数据。以下是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. Java中的命名规范到底是怎样的

    内容摘要:命名规范二,java中的方法名,对象名和字段名的第一个单词的首写字母应该小写,而后面的每个单词的首字母都应该小写 要想将java基础学的十分的牢固就必须将java中的命名规范掌握好了.俗话说 ...

  2. 用Webpack构建Vue项目

    开始之前,需要安装node环境.(安装过程在此就不啰嗦了)   1.创建基本结构 首先我们要创建一个空文件夹(我这里叫todos,你可以随便命名)作为项目的根目录. 创建一个没有任何依赖关系的pack ...

  3. Ajax+Struts做登录判断

    Action类里: /* * 登录 */ public ActionForward doLogin(ActionMapping mapping,ActionForm form,HttpServletR ...

  4. 什么是 HTML5?

    HTML5 是下一代的 HTML. 什么是 HTML5? HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML 的上一个版本诞生于 1999 年.自从那以后,Web ...

  5. 动画库animate.css的用法

    简介 animate.css是一个来自国外的 CSS3 动画库,它预设了引起弹跳(bounce).摇摆(swing).颤抖(wobble).抖动(shake).闪烁(flash).翻转(flip).旋 ...

  6. javascript中天气接口案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. BZOJ 1725: [Usaco2006 Nov]Corn Fields牧场的安排 状压动归

    Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧 ...

  8. Codevs 1077 多源最短路( Floyd水 )

    链接:传送门 思路:裸 Floyd /************************************************************************* > Fi ...

  9. 51nod-完美字符串(贪心)

    约翰认为字符串的完美度等于它里面所有字母的完美度之和.每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数. 约翰不在乎字母大小写.(也就是说字母F和f)的完美度相同. ...

  10. jenkins 打包 springboot

    遇到的坑 jdk maven  可以自己配置 也可以让jenkins生成 jenkins创建的项目打的包在  /var/lib/jenkins/jobs/ 需要手动去下载pom中的jar  吧pom复 ...