socket网络编程学习笔记之服务器编程

  • 服务器源代码:

文中代码段的注释目前还不够完整,可能会有部分注释会有错误,现阶段要专心考研了,考完研再回来好好研究研究!考研加油!

#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);                                                                                                           

}

猜你喜欢

转载自blog.csdn.net/weixin_42289213/article/details/88380452