c学习socket

int socket(int domain, int type, int protocol);

domain:协议域,协议族(family),决定了socket的地址类型
        AF_UNIX:本机通信
        AF_INET:IPv4
        AF_INET6:IPv6

type:socket类型
        SOCK_STREAM:TCP流
        SOCK_DGRAM:UDP数据报
        SOCK_RAW:原始套接字
        SOCK_PACKET
        SOCK_SEQPACKET

protocol:协议,一般设置为0,domain参数未知情况下,可以起确定协议的种类的作用
        IPPROTO_TCP:TCP传输协议
        IPPTOTO_UDP:UDP传输协议
        IPPROTO_SCTP:STCP传输协议
        IPPROTO_TIPC:TIPC传输协议

创建一个socket描述符(socket descriptor),它唯一标识一个socket,后续把它作为参数,通过它来进行一些读写操作
 

=================================服务端==================================

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

sockfd:服务端socket描述字,它是通过socket()函数创建了,唯一标识一个socket
addr:一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址
addrlen:地址长度

创建socket时,返回的socket描述字它存在于协议族空间中,没有具体地址。调用bind()函数将特定地址赋给socket,否则调用connect()、listen()时系统会自动随机分配

int listen(int sockfd, int backlog);

sockfd:服务端socket描述字
backlog:可以排队的最大连接个数

socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求。

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

sockfd:服务端socket描述字
addr:客户端的协议地址
addrlen:客户端的协议地址长度

accpet成功后,返回值是由内核自动生成的一个全新的描述字,代表与返回客户的TCP连接

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

返回是实际copy的字节数

ssize_t:有符号整型
size_t:无符号整型

sockfd:读取数据的套接字描述符
buf:存储数据的缓存区地址指针。
len:缓存区的最大尺寸
flags:标志,一般都为0

 

 =================================客户端==================================

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

sockfd:客户端的socket描述字
addr:服务器的socket地址
addrlen:地址的长度

客户端通过调用connect函数来建立与TCP服务器的连接

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

send 的参数含义如下:
sockfd:与远程程序连接的套接字描述符
buf:发送的信息的地址指针
len:信息长度。
flags:发送标记,一般都设为0

int close(int fd);

fd:描述字

测试代码

服务端

#include<stdio.h>

客户端

附件描述

#define UNIX_PATH_MAX    108

//Unix地址结构
struct sockaddr_un { 
    sa_family_t sun_family;               /* 协议簇 */ 
    char        sun_path[UNIX_PATH_MAX];  /* 本地文件*/ 
};

//------------------------------------------------------------------------------

//ipv4地址结构
struct sockaddr_in {
    sa_family_t    sin_family; /* 协议簇 */
    in_port_t      sin_port;   /* 端口 */
    struct in_addr sin_addr;   /* 地址 */
};

/* ip结构 */
struct in_addr {
    uint32_t       s_addr;     /* ip */
};

//------------------------------------------------------------------------------

//ipv6地址结构:
struct sockaddr_in6 { 
    sa_family_t     sin6_family;   /* 协议簇 */
    in_port_t       sin6_port;     /* 端口 */
    uint32_t        sin6_flowinfo; /* IPv6 flow information */ 
    struct in6_addr sin6_addr;     /* 地址 */
    uint32_t        sin6_scope_id; /* Scope ID (new in 2.4) */ 
};

/* ip结构 */
struct in6_addr { 
    unsigned char   s6_addr[16];   /* ip */
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值