实现网络Socket服务端

1.服务端编程流程
这里写图片描述
2.服务端编程–具体实现
编程流程:
1、创建套接字—socket 处理地址和端口
2、套接字绑定本地的地址和端口—bind
3、套接字设定监听状态(等待客服端消息)–listen
4、接受消息,返回一个用连接的新套接字
5、新套接字通信—read,write
6、关闭套接字—close

/*********************************************************************************
 *      Copyright:  (C) 2018 NULL
 *                  All rights reserved.
 *
 *       Filename:  socket_server.c
 *    Description:  This file 
 *                 
 *        Version:  1.0.0(2018年08月05日)
 *         Author:  DingHuanhuan <[email protected]>
 *      ChangeLog:  1, Release initial version on "2018年08月05日 19时30分27秒"
 *                 
 ********************************************************************************/

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

/*   sockaddr_in{} and other Internet define */ 
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
/*    strerror(),perror(), errno head file   */
#include <errno.h>  

#define  BUF_SIZE    1024
#define  port        12345
#define  IP_addr     "192.168.2.2"

int main(int argc, char **argv)
{
    int        listen_fd,accept_fd;    //创建两个套接字,一个开启连接,一个通信
    struct     sockaddr_in    server_addr;//服务器端地址,是一个结构体,等下要填充ipV4或者ipV6的结构
    char       buf[BUF_SIZE];

    listen_fd = socket(AF_INET,SOCK_STREAM,0);
    if(listen_fd < 0)
    {
        printf("Creat socket failure:%s\n",strerror(errno));
        return -1;
    }
    printf("Socket creat fd is %d\n",listen_fd);

    /*服务器设置,设置server地址和端口号,用于接受任何client端*/
    memset(&server_addr,0,sizeof(server_addr));       //清空再设置ipV4地址
    server_addr.sin_family = AF_INET;                //设置为ipV4地址
    server_addr.sin_port = htons(port);             //端口号,主机字节序转网络字节序,short是16位
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //设置host主机地址
    if(bind(listen_fd,(struct sockaddr *)&server_addr,sizeof(server_addr))<0)
    {
        printf("Bind socket failure %s\n",strerror(errno));
        return -2;
    }
    printf("socket bind ok\n");

    listen(listen_fd,15);//等待连接,最大连接数设为15
    printf("socket listen ok\n");
    printf("Start accept %d\n",listen_fd);
    accept_fd = accept(listen_fd,NULL,NULL);
    //accept接受的参数必须经过listen和bing处理过,返回一个新的socket码
    //新的socket传送数据,旧的socket还能继续用accept接受请
    //后面两个参数设置为NULL,那么会在系统连接时自动根据客户端信息填入

    if(accept_fd <0)
    {
        printf("Listen socket failure: %s\n", strerror(errno));  //如果监听失败,打印错误信息
        return -1;
    }
    printf("socked accept fd is %d\n",accept_fd);


    while(1)
    {
        sleep(2);
        memset(buf,0,BUF_SIZE);
        send(accept_fd,"From\n",32,0);
        sleep(2);
        recv(accept_fd,buf, BUF_SIZE,0);
        printf("read : %s\n",buf);
        sleep(2);


    }
    close(accept_fd);
    close(listen_fd);


    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_38022615/article/details/81414367