- 服务器源代码:
文中代码段的注释目前还不够完整,可能会有部分注释会有错误,现阶段要专心考研了,考完研再回来好好研究研究!考研加油!
#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define Listen_port 6666 //宏定义服务器监听端口号
#define BACK_LOG 13
#define MSG_STR "Hello ! I'm server !" //宏定义服务器发送的消息
int main(int argc , char **argv)
{
int listen_fd , client_fd = -1 ; //初始化整形监听文件描述符,客户端文件描述符
struct sockaddr_in serv_addr ; //与客户端代码类似,定义sockaddr_in结构体类型服务器地址结构体
struct sockaddr_in cli_addr ; //定义sockaddr_in结构体类型客户端地址结构体
socklen_t cliaddr_len ; //定义socklen_t类型的客户端地址长度变量
char buf[1024]; //定义一个1024大小的字符数组
int rv = -1 ; //定义返回值为-1
listen_fd = socket(AF_INET , SOCK_STREAM , 0 ); //调用socket函数设置网络通信类型
if(listen_fd < 0) //如果socket函数返回值小于0表示出错,可以检查设备问题
{
printf("creat socket failure : %s\n",strerror(errno)); //打印输出错误信息
return -1 ;
}
printf("socket creat fd[%d]\n", listen_fd);
memset(&serv_addr, 0 , sizeof(serv_addr)); //初始化结构体
serv_addr.sin_family = AF_INET ; //设置TCP/IP通信参数
serv_addr.sin_port = htons(Listen_port); //设置服务器监听端口,将十六进制端口号通过htons()函数转化为网络字符串类型端口号
serv_addr.sin_addr.s_addr = htons(INADDR_ANY);
if(bind(listen_fd , (struct sockaddr*)&serv_addr , sizeof(serv_addr)) < 0) //调用bind()函数绑定服务器地址
{
printf("creat socket failure : %s\n", strerror(errno));
return -2 ;
}
printf("socket[%d] bind on port[%d] for all IP address ok\n",listen_fd , Listen_port);
listen(listen_fd, BACK_LOG); //调用listen()函数开始监听端口
while(1)
{
printf("\nStart waiting and accept new client connect...\n");
client_fd = accept(listen_fd , (struct sockaddr*)&cli_addr , &cliaddr_len); //调用accept()函数开始接收来自客户端的消息
if(client_fd < 0 ) //若accept()函数返回值小于0,表示接收失败
{
printf("accept new socket failure : %s\n", strerror(errno));
return -2 ;
}
printf("Accept new client[%s:%d] with fd [%d]\n", inet_ntoa(cli_addr.sin_addr) , ntohs(cli_addr.sin_port) , client_fd);
memset( buf , 0 , sizeof(buf)); //清空字符数组
if((rv = read(client_fd , buf , sizeof(buf))) < 0 ) //开始读取来自客户端的数据,若返回值小于0,表示读取失败
{
printf("Read data from client socket[%d] failure: %s\n", client_fd , strerror(errno));
close(client_fd);
continue ;
}
else if( rv == 0 ) //若返回值为0,表示客户端中断连接
{
printf("client socket[%d] disconnected\n" , client_fd);
close(client_fd); //关闭客户端文件描述符,终止通信
continue ;
}
printf("read %d bytes data from client[%d] and echo it back : '%s'\n" , rv , client_fd , buf );
if( write(client_fd , MSG_STR , rv ) < 0) //若接收到了来自客户端的数据,则向客服端发送数据
{
printf("write %d bytes data back to client[%d] failure: %s\n", rv , client_fd , strerror(errno));
close(client_fd);
}
sleep(1);
close(client_fd);
}
close(listen_fd);
}