c语言实现socket编程--客户端与客户端之间通过服务器进行通讯

socket编程:
服务端可以分为:socket()、bind()、listen()、accept() 剩下就可以处理数据
客户端有:socket()、connect()、处理数据
socket(): 创建一个描述符用来唯一标识一个socket。
  int socket(int domain, int type, int protocol);
  domain:即协议域,又称为协议族(family)。常用的协议族有,AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等等。协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。
  type:指定socket类型。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW(原始头报文)、 SOCK_PACKET、SOCK_SEQPACKET等等。
 protocol:故名思义,就是指定协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议
 protocol为0时,会自动选择type类型对应的默认协议 失败是 返回值为-1
 当我们调用socket创建一个socket时,返回的socket描述字它存在于协议族(address family,AF_XXX)空间中,但没有一个具体的地址。
 如果想要给它赋值一个地址,就必须调用bind()函数,否则就当调用connect()、listen()时系统会自动随机分配一个端口。
 eg:int client_socket = socket(AF_INET, SOCK_STREAM, 0);
bind()函数: 函数把一个地址族中的特定地址赋给socket。例如对应AF_INET、AF_INET6就是把一个ipv4或ipv6地址和端口号组合赋给socket。
 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
 sockfd:即socket描述字,它是通过socket()函数创建了,唯一标识一个socket。bind()函数就是将给这个描述字绑定一个名字。
 addr:一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址。
 addrlem:地址长度。
 bind()函数的返回值为0时表示绑定成功,-1表示绑定失败,errno的错误值如表1所示。
 eg:int ret = bind(listen_socket, (struct sockaddr *)&service_addr, sizeof(service_addr)) //前面已经定义过结构体了struct sockaddr_in service_addr; memset(service_addr, 0, sizeof(service_addr)); //初始化service_addr
listen()、connect()函数: 如果作为一个服务器,在调用socket()、bind()之后就会调用listen()来监听这个socket,如果客户端这时
 调用connect()发出连接请求,服务器端就会接收到这个请求。
 int listen(int sockfd, int backlog);
 int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
 listen函数的第一个参数即为要监听的socket描述字,第二个参数为相应socket可以排队的最大连接个数。socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求。若成功则为0,若出错则为-1
 connect函数的第一个参数即为客户端的socket描述字,第二参数为服务器的socket地址,第三个参数为socket地址的长度。客户端通过调用
 connect函数来建立与TCP服务器的连接。 如果请求连接成功,则返回0,否则返回-1 包含错误码。
eg: #define BACKLOG 5
 int ret = listen(listen_socket, BACKLOG)
 int listen_socket = connect(client_socket, (struct sockaddr *)&addr, addrlen)
accept()函数: TCP服务器端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址了。TCP客户端依次调用socket()、conne

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值