tcp socket 封装(二) - 客户端套接字接口设计-课后任务
我要参与
tcp socket 封装(二) - 客户端套接字接口设计-课后任务
学习任务 753
等3人参与
来源: 第15周 / 物联网/嵌入式工程师

练习

实现 tcp 客户端 socket 创建与等待连接接口设计

去发布

登录后即可发布作业,立即

我的作业

全部作业 58

大禹123

debug.h

#ifndef _DEBUG_H_
#define _DEBUG_H_

/*
	__FILE__:输出文件名
	__FUNCTION__:输出函数名
	__LINE__:输出行号
    }while:括号要与while连接在一起
 */
#define DEBUG_INFO(args...) do{ \
    char b__[1024];\
    sprintf(b__,args);\
    fprintf(stderr,"[%s,%s,%d] : %s", __FILE__ , __FUNCTION__ ,__LINE__ ,b__); \
}while(0)
#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
代码块
复制 预览
复制成功!

tcp_socket.h

#ifndef __TCP_SOCKET_H_
#define __TCP_SOCKET_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>         /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>

// 创建并初始化 tcp 服务器 socket
extern int create_tcp_server_socket(const char *ip,unsigned short port);

// 用于创建tcp客户端连接
extern int create_tcp_client_socket(const char *server_ip,unsigned short server_port);
//等待与客户端连接
extern int wait_for_connect(int sockfd, struct sockaddr_in* client_addr);
#endif

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
代码块
复制 预览
复制成功!

tcp_socket.c

#include "tcp_socket.h"
#include "debug.h"

#define BACKLOG 10
int create_tcp_server_socket(const char *ip,unsigned short port)
{
    int sfd;
    int ret;
    struct sockaddr_in server_addr;
    socklen_t len = sizeof(struct sockaddr_in);
    
    //1、创建套接字
    sfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sfd == -1)
    {
        DEBUG_INFO("[ERROR] socket:%s\n", strerror(errno));
        return -1;
    }
    
    bzero(&server_addr, len);
    //地址族/协议族  与socket函数第一个参数相同
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(port);
    server_addr.sin_addr.s_addr = inet_addr(ip); 

    //2、绑定ip,端口号
    ret = bind(sfd, (const struct sockaddr *) &server_addr, len);
    if(ret == -1)
    {
        DEBUG_INFO("[ERROR] bind():%s\n", strerror(errno));
        return -1;
    }
    
    //3、设置套接字为监听状态,建立监听队列,如果服务端处理不过来的话,会把客户端连接请求缓存在监听队列里,如果超过最大队列数量,那么会被拒绝连接
    ret = listen(sfd, BACKLOG); 
    if(ret == -1)
    {
        DEBUG_INFO("[ERROR] listen():%s\n", strerror(errno));
        return -1;
    }

    return sfd;
}


int create_tcp_client_socket(const char *server_ip,unsigned short server_port)
{
    int sfd;
    int ret;
    struct sockaddr_in server_addr;

    //1、创建套接字
    sfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sfd == -1)
    {
        DEBUG_INFO("[ERROR] socket():%s\n", strerror(errno));
        return -1;
    }
    
    bzero(&server_addr, sizeof(struct sockaddr_in));
    //地址族/协议族  与socket函数第一个参数相同
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(server_port);
    server_addr.sin_addr.s_addr = inet_addr(server_ip); 

    ret = connect(sfd, (const struct sockaddr *) &server_addr, sizeof(struct sockaddr_in));
    if(ret == -1)
    {
        DEBUG_INFO("[ERROR] connect():%s\n", strerror(errno));
        return -1;
    }

    return sfd;
}


int wait_for_connect(int sockfd, struct sockaddr_in* client_addr)
{
    int cfd;
    socklen_t len = sizeof(struct sockaddr_in);
    cfd = accept(sockfd, (struct sockaddr *)client_addr, &len);
    if(cfd == -1)
    {
        DEBUG_INFO("[ERROR] accept():%s\n", strerror(errno));
        return -1;
    }

    return cfd;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
代码块
复制 预览
复制成功!
提交于  2024-11-26 10:08:59
评论 1
讲师点评
评分:100
无__名
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师