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

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

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

转载于:https://www.cnblogs.com/lxjshuju/p/7025849.html

项目简介: 采用I/O复用技术select实现socket通信,采用多线程负责每个客户操作处理,完成Linux下的多客户聊天室! OS:Ubuntu 15.04 IDE:vim gcc make DB:Sqlite 3 Time:2015-12-09 ~ 2012-12-21 项目功能架构: 1. 采用client/server结构; 2. 给出客户操作主界面(注册、登录、帮助和退出)、登录后主界面(查看在线列表、私聊、群聊、查看聊天记录、退出); 3. 多客户可同时连接服务器进行自己操作; ##服务器端## 1. server.c:服务器端主程序代码文件; 2. config.h:服务器端配置文件(包含需要的头文件、常量、数据结构及函数声明); 3. config.c:服务器端公共函数的实现文件; 4. list.c:链表实现文件,用于维护在线用户链表的添加、更新、删除操作; 5. register.c:服务器端实现用户注册; 6. login.c:服务器端实现用户登录; 7. chat.c:服务器端实现用户的聊天互动操作; 8. Makefile:服务器端make文件,控制台执行make命令可直接生成可执行文件server ##客户端## 1. client.c:客户端主程序代码文件; 2. config.h:客户端配置文件(包含需要的头文件、常量、数据结构及函数声明); 3. config.c:客户端公共函数的实现文件; 4. register.c:客户端实现用户注册; 5. login.c:客户端实现用户登录; 6. chat.c:客户端实现用户的聊天互动操作; 7. Makefile:客户端make文件,控制台执行make命令可直接生成可执行文件client
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值