Linux下面基于TCP多线程聊天室(客户端)

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

主要是使用多线程去等待接受数据和发送数据,下面是客户端的代码:

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);

}

时间: 2024-07-28 22:01:19

Linux下面基于TCP多线程聊天室(客户端)的相关文章

Linux下面基于TCP多线程聊天室(服务器)

接上篇博文,本文是服务器端的实现,主要实现的功能,就是现实客户端的连接,转发客户端发送的消息,以及客户端掉线提示等功能,同时可以在这这上面扩展和TCP以及线程相关的功能木块. tcpreceive.h 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #ifndef TCPRECEIVE_H #define TCPRECEIVE_H #define BUFFSIZE 2048 #define listen_max 5 int cond; int

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

接上篇博文,本文是server端的实现,主要实现的功能,就是现实client的连接.转发client发送的消息.以及client掉线提示等功能,同一时候能够在这这上面扩展和TCP以及线程相关的功能木块. tcpreceive.h 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #ifndef TCPRECEIVE_H #define TCPRECEIVE_H #define BUFFSIZE 2048 #define listen_max 5

基于java网络聊天室--客户端

ChatClient.java 包含名为ChatClient的public类,其主要功能为定义客户端的界面,添加时间监听与事件处理.该类定义了Connect()与DisConnect()方法实现与客户端的连接与断开连接.当登陆到指定的服务器时,调用ClientReceive类实现消息收发,同时该类还定义了SendMessaga()方法来其他用户发送带有表情的消息或悄悄话. 1 /* 2 * To change this license header, choose License Headers

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

刚看的c++11多线程,写个聊天室试试编译的时候加上 c++11 和 多线程库g++ -Wall -std=c++0x -pthread -o server server.cppserver 和client 都是 q 退出?1. [代码]server.cpp #include <iostream>#include <thread>#include <arpa/inet.h>#include <cstring>#include <vector>#i

多线程聊天室

基于Java的多线程聊天室 客户端: public class MultiThreadClient { private static class RecMsg implements Runnable{ private Socket client; public RecMsg(Socket client) { this.client = client; } @Override public void run() { Scanner sc = null; try { sc = new Scanner

基于linux的TCP网络聊天室设计与实现

利用Linux实现基于TCP模式的网络聊天程序 主要完成的两大组成部分为:服务器和客户端. 服务器程序主要负责监听客户端发来的消息. 客户端需要登录到服务器端才可以实现正常的聊天功能.该程序是利用进程以及共享内存来实现群发送消息的. 以下简单分析一下服务器端和客户端两个方面所要完成的任务. 服务器的主要功能如下: 在特定的端口上进行监听,等待客户端的连接. 用户可以配置服务器端的监听端口. 向连接的客户端发送登录成功信息. 向已经连接到服务器的客户端的用户发送系统消息. 使用TCP多线程并发服务

Linux网络编程--聊天室客户端程序

聊天室客户端程序 #define _GNU_SOURCE 1 #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <assert.h> #include <stdio.h> #include <unistd.h> #include <string.h> #in

Socket编程(简易聊天室客户端/服务器编写、CocoaAsyncSocket)

Socket编程(简易聊天室客户端/服务器编写.CocoaAsyncSocket) 一.Socket 1.1 Socket简介 Socket就是为网络服务提供的一种机制.网络通信其实就是Socket间的通信,通信的两端都是Socket,数据在两个Socket间通过IO传输. 在Web服务大行其道的今天,调用Web服务的代价是高昂的,尤其是仅仅是抓取少量数据的时候尤其如此.而使用Socket,可以只传送数据本身而不用进行XML封装,大大降低数据传输的开销.Socket允许使用长连接,允许应用程序运

聊天室客户端源码

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;import java.net.Unkno