第3章详细设计和实现
3.1相关技术
1)TCP编程,主要包括socket()函数、bind()函数、listen()函数、recv()函数、send()函数以及客户端的connect()函数。
2)C语言中对结构体的操作,和对字符串的比较
3)对文件的读写操作
4)popen调用shell
3.2开发工具和运行环境
本系统在ubantu 16.4 LTS环境下开发,所用的工具为vi编辑器和gedit编辑器,以及gcc编译工具。
3.3主要功能的源码
3.3.1服务器端socket的建立
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) //创建socket
printf( "socket failed" );
/* 设置端口快速重用*/
optval = 1;
if ( setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (void *)&optval, sizeof(int)) < 0 )
printf( "setsockopt failed" );
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons( PORT );
server_addr.sin_addr.s_addr = htonl( INADDR_ANY );
if ( bind(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)) < 0 ) //绑定ip和端口号
printf( "bind failed" );
if ( listen(sockfd, MAX_LISTEN) < 0 ) //建立监听
printf( "listen failed" );
3.3.2对客户端的发送信息进行处理
while ( 1 ) {
if ( (connfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_size)) < 0 ) //响应客户端请求
printf( "accept failed" );
printf( "Server accept a client: ip = %s\n",inet_ntoa(client_addr.sin_addr) ); //打印客户端ip
/* 创建子进程处理客户端请求 */
if ( (pid = fork()) == 0 ) {
while ( 1 ) {
/* 接受客户端信息 */
if ( (recv_bits = recv(connfd, buffer, BUF_SIZE, 0)) < 0 )
printf( "recv failed" );
/* 去除最后一个字符 */
buffer[recv_bits - 1] = '\0';
/* 用户名鉴定 */
if ( recv_type == USERNAME ) {
if ( strcmp(name, buffer) != 0 ) {
&nb