实验内容
编写两个程序,一个Server,一个Client,分别运行在两个shell窗口,通过Socket实现两个Shell窗口的即时通信: 即在A窗口输入Hello,B窗口会立即显示“Client: Hello” 。 B窗口也可以输入任意内容,比如“Nice to meet you”,在A窗口立即显示“Server:Nice to meet you”。 提示:本地地址是127.0.0.1,端口最好10000以上,避免占据其他应用端口。注意访问权限问题。
代码实现
# include <stdio.h>
# include <signal.h>
# include <stdlib.h>
# include <string.h>
# include <unistd.h>
# include <netinet/in.h>
# include <sys/socket.h>
# include <arpa/inet.h>
# include <sys/types.h>
# define port 8888
int main ( int argc, char * argv[ ] )
{
int socket_fp, pid1, pid2, res;
socklen_t clientaddr_len;
struct sockaddr_in serveraddr, clientaddr;
char buf[ 100 ] ;
char str[ 100 ] ;
socket_fp = socket ( AF_INET, SOCK_STREAM, 0 ) ;
if ( socket_fp== - 1 )
{
perror ( "The socket is error!\n" ) ;
exit ( 0 ) ;
}
serveraddr. sin_family = AF_INET;
serveraddr. sin_port = htons ( port) ;
serveraddr. sin_addr. s_addr = INADDR_ANY;
bzero ( serveraddr. sin_zero, 8 ) ;
res = bind ( socket_fp, ( struct sockaddr * ) ( & serveraddr) , sizeof ( serveraddr) ) ;
if ( res== - 1 )
{
perror ( "The bind is error!\n" ) ;
exit ( 0 ) ;
}
res = listen ( socket_fp, 2 ) ;
if ( res== - 1 )
{
perror ( "The listen is error!\n" ) ;
exit ( 0 ) ;
}
printf ( "服务端已经启动!\n" ) ;
while ( 1 )
{
clientaddr_len = sizeof ( struct sockaddr ) ;
res = accept ( socket_fp, ( struct sockaddr * ) ( & clientaddr) , & clientaddr_len) ;
if ( res == - 1 )
{
perror ( "The accept is error!\n" ) ;
exit ( 0 ) ;
}
else if ( pid1= fork ( ) == 0 )
{
printf ( "客户端连接成功!\n" ) ;
while ( 1 )
{
if ( pid2= fork ( ) == 0 )
{
fgets ( str, sizeof ( str) , stdin ) ;
send ( res, str, sizeof ( str) , 0 ) ;
}
recv ( res, buf, sizeof ( buf) , 0 ) ;
printf ( "Client:%s" , buf) ;
}
}
}
return 0 ;
}
# include <stdio.h>
# include <signal.h>
# include <stdlib.h>
# include <string.h>
# include <unistd.h>
# include <netinet/in.h>
# include <arpa/inet.h>
# include <sys/socket.h>
# include <sys/types.h>
# define port 8888
void func_back ( int signum)
{
printf ( "signum: %d\n" , signum) ;
}
int main ( int argc, char * argv[ ] )
{
int res, pid, socket_fp;
struct sockaddr_in serveraddr;
char buf[ 100 ] ;
char str[ 100 ] ;
socket_fp = socket ( AF_INET, SOCK_STREAM, 0 ) ;
if ( socket_fp== - 1 )
{
perror ( "The socket is error!\n" ) ;
exit ( 0 ) ;
}
serveraddr. sin_family = AF_INET;
serveraddr. sin_port = htons ( port) ;
inet_aton ( "127.0.0.1" , & serveraddr. sin_addr) ;
bzero ( serveraddr. sin_zero, 8 ) ;
res = connect ( socket_fp, ( struct sockaddr * ) ( & serveraddr) , sizeof ( serveraddr) ) ;
if ( res== - 1 )
{
perror ( "The connect is error!\n" ) ;
exit ( 0 ) ;
}
printf ( "客户端连接成功!\n" ) ;
while ( 1 )
{
signal ( SIGINT, func_back) ;
if ( pid= fork ( ) == 0 )
{
recv ( socket_fp, buf, sizeof ( buf) , 0 ) ;
printf ( "Server:%s" , buf) ;
}
fgets ( str, sizeof ( str) , stdin ) ;
send ( socket_fp, str, sizeof ( str) , 0 ) ;
}
return 0 ;
}
实验结果