[セットトップ]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!
" );
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
" , strerror ( errno ));
}
pth_buf [ result ] = '\0' ;
printf ( "%s
" , 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
" , strerror ( errno ));
pthread_exit ( NULL );
}
if ( - 1 == ( connfd = connect ( socketfd ,( struct sockaddr * ) & server_addr , sizeof ( server_addr ))))
{
fprintf ( stderr , "Connect Error:%s
" , strerror ( errno ));
pthread_exit ( NULL );
}
printf ( "You can use \" Ctrl + D \" to quit.
" );
if ( SIG_ERR == signal ( SIGUSR1 , quit ))
{
fprintf ( stderr , "Can't set SIGUSR1 signal action!
" );
pthread_exit ( NULL );
}
if ( 0 != pthread_create ( & tid , NULL ,( void * ) pth_read ,( void * ) buf ))
{
fprintf ( stderr , "Create pthread Error:%s
" , 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!
" );
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
" , strerror ( errno ));
}
pth_buf [ result ] = '\0' ;
printf ( "%s
" , 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
" , strerror ( errno ));
pthread_exit ( NULL );
}
if ( - 1 == ( connfd = connect ( socketfd ,( struct sockaddr * ) & server_addr , sizeof ( server_addr ))))
{
fprintf ( stderr , "Connect Error:%s
" , strerror ( errno ));
pthread_exit ( NULL );
}
printf ( "You can use \" Ctrl + D \" to quit.
" );
if ( SIG_ERR == signal ( SIGUSR1 , quit ))
{
fprintf ( stderr , "Can't set SIGUSR1 signal action!
" );
pthread_exit ( NULL );
}
if ( 0 != pthread_create ( & tid , NULL ,( void * ) pth_read ,( void * ) buf ))
{
fprintf ( stderr , "Create pthread Error:%s
" , 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
" , strerror ( errno ));
pthread_exit ( NULL );
}
printf ( "OK!
" );
if ( 0 != pthread_join ( tid , & tret ))
{
fprintf ( stderr , "Join thread error:%s
" , 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!
" );
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
" , strerror ( errno ));
}
pth_buf [ result ] = '\0' ;
printf ( "%s
" , 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
" , strerror ( errno ));
pthread_exit ( NULL );
}
if ( - 1 == ( connfd = connect ( socketfd ,( struct sockaddr * ) & server_addr , sizeof ( server_addr ))))
{
fprintf ( stderr , "Connect Error:%s
" , strerror ( errno ));
pthread_exit ( NULL );
}
printf ( "You can use \" Ctrl + D \" to quit.
" );
if ( SIG_ERR == signal ( SIGUSR1 , quit ))
{
fprintf ( stderr , "Can't set SIGUSR1 signal action!
" );
pthread_exit ( NULL );
}
if ( 0 != pthread_create ( & tid , NULL ,( void * ) pth_read ,( void * ) buf ))
{
fprintf ( stderr , "Create pthread Error:%s
" , strerror ( errno ));
pthread_exit ( NULL );
}
while ( NULL != ( fgets ( buf , BUFFSIZE , stdin )))
{
write ( socketfd , buf , strlen ( buf ) - 1 );
}
pthread_cancel ( tid );
pthread_exit ( NULL );
}