TCP 服务器客户端编程流程

客户端调用序列

  • 调用socket函数创建套接字
  • 调用connect连接服务端
  • 调用I/O函数(accept/recv)与服务器端通讯
  • 调用close关闭套接字

服务器端调用序列

  • 调用socket函数创建本地套接字
  • 调用bind函数绑定本地地址和端口
  • 调用listen启动监听
  • 调用accept从已经连接的队列中提出客户连接
  • 调用I/O函数(accept/recv)与客户端通讯
  • 调用close关闭套接字

 服务端代码

/*服务端TCP程序一般流程
 *1、创建socket
 *2、绑定端口和ip
 *3、监听socket
 *4、接收客户端的请求
 *5、从缓冲区中读取数据
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <arpa/inet.h>
#include <netinet/in.h>

#define PORT 5000
#define IP "192.168.0.106"
#define BACKLOG 5

int main()
{
    int listen_fd;
    int accept_fd;
    char buf[1024] = {0};//读写缓冲区
    struct sockaddr_in server_addr;
    //需要获取客户端相关信息
    struct sockaddr_in client_addr;
    socklen_t client_len;
    client_len = sizeof(client_addr);

    //创建socket
    if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("socket");
        return 1;
    }

    //绑定端口和ip
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr.s_addr = inet_addr(IP);

    if (bind(listen_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("bind");
        return 2;
    }

    //监听socket
    if (listen(listen_fd, BACKLOG) < 0) {
        perror("listen");
        return 3;
    }

    while(1) {
        //接收客户端的请求
        if ((accept_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &client_len)) < 0) {
            perror("accept");
            return 4;
        }
        //打印客户端信息
        printf("connected with ip: %s: port:%d\n", 
            inet_ntop(AF_INET, &client_addr.sin_addr, buf, 1024), ntohs(client_addr.sin_port));

        while (1) {
            memset(buf, 0, sizeof(buf));
            //从缓冲区中读取数据
            ssize_t size = read(accept_fd, buf, sizeof(buf) - 1);
            if (size > 0)
                printf("client send: %s\n", buf);
            else if (size == 0) {
                printf("read done!\n");
                close(accept_fd);
                break;
            }
            else {
                perror("read");
                close(accept_fd);
                break;
            }   
        }
    }

    close(listen_fd);
    return 0;
}

客户端代码

/*客户端TCP程序一般流程
 *1、创建socket
 *2、向服务端发起连接
 *3、向缓冲区中写入数据
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <arpa/inet.h>
#include <netinet/in.h>

#define PORT 5000
#define IP "192.168.0.106"

int main()
{
    int client_fd;
    char buf[1024] = {0};//读写缓冲区
    struct sockaddr_in client_addr;
    ssize_t size;

    //创建socket
    if ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("socket");
        return 1;
    }

    //填充ip端口信息
    client_addr.sin_family = AF_INET;
    client_addr.sin_port = htons(PORT);
    client_addr.sin_addr.s_addr = inet_addr(IP);

    //向服务端发起连接
    if (connect(client_fd, (struct sockaddr*)&client_addr, sizeof(client_addr)) < 0) {
        perror("connect");
        return 2;
    }

    while(1) {
        memset(buf, 0, sizeof(buf));
        //从标准输入获取字符串
        if (!gets(buf)) {
            perror("gets");
            return 3;
        }
        if (strcmp(buf, "quit") == 0)
            break;
        if (write(client_fd, buf, strlen(buf)) != strlen(buf)) {
            perror("write");
            return 4;
        }
    }

    close(client_fd);
    return 0;
}

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值