网络编程知识点总结(3)

目录

socket 服务器的开发步骤和代码实现

1.创建套接字

2.为套接字添加信息 (IP地址和端口号)

3.监听网络连接

4.监听到有客户端接入,接受一个连接

5.htons()函数介绍


socket 服务器的开发步骤和代码实现

1.创建套接字

socket()函数

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

domain:
指明所使用的协议族,通常为 AF_INET,表示互联网协议族(TCP/IP 协议族)
AF_INET IPv4因特网域.
AF_INET6 IPv6 因特网域
AF_UNIX Unix 域
AF_ROUTE 路由套接字
AF_KEY 密钥套接字
AF_UNSPEC 未指定

type参数指定 socket 的类型
SOCK_STREAM:
流式套接字提供可靠的、面向连接的通信流,它使用 TCP 协议,从而保证了数据传输的正确性和顺序性
SOCK_DGRAM:
数据报套接字定义了一种无连接的服,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠、无差错的。它使用教据报协议UDP
SOCK_RAW:                                                                                                                                    允许程序使用低层协议,原始套接字允许对底层协议如 IP 或 ICMP 进行直接访问,功能强大但使用较为不便,主要用于一些协议的开发

protocol:
通常赋值"0"
0选择type类型对应的默认协议
IPPROTO_TCP TCP 传输协议
IPPROTO_UDP UDP 传输协议
IPPROTO_SCTP SCTP 传输协议
IPPROTO_TIPC TIPC 传输协议

2.为套接字添加信息 (IP地址和端口号)

bind()函数: IP号端口号与相应描述字赋值函数

#include <sys/types.h>   /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);


功能
用于绑定 IP 地址和端口号到 socketfd
参数
sockfd
是一个 socket 描述符
addr
是一个指向包含有本机 IP 地址及端口号等信息的 sockaddr 类型的指指向要绑定给 sockfd 的协议地址结构,这个地址结构根据地址创建 socket 时的地址协议族的不同而不同

struct sockaddr{
    unisgned short as_family;    //协议族                                              
    char sa_data[14];            //IP+端口
};

同等替换

struct sockaddr_in {
    sa_family_t sin_family; //协议族
    in_port_t sin_port;  //端口号
    struct in_addr sin_addr;  //IP地址结构体
    unsigned char sin_zero[8];  //没有实际意义只是为跟sockaddr结构在内存中对亮这样两者才能相互转换
};

地址转换API

int inetaton(const char* straddrstruct in_addr *addrp);                                                                      把字符串形式的“10.100.13.165”转为网络能识别的格式(用命令ifconfig查看自己的inet addr)

char* inetntoa(struct in_addr inaddr);                                                                                               把网络格式的ip地址转为字符串形式

3.监听网络连接

listen()函数:监听设置函数

#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int listen(int sockfd, int backlog);

功能
设置处理的最大连接数,listen()并未开始接受连线,只是设置 sockect listen 模式,listen 函数只用于服务器端,服务器进程不知道要与谁连接,因此,它不会主动此要求与某个进程连接,只是一直监听是否有其他客户进程与之连接,然后响应该连接清求,并对它做出处理,一个服务进程可以同时处理多个客户进程的连接。主要就两个功能:将一个未连接的套接字转换为一个被动套接字(监听),规定内核为相应套接字排队的最大连接数。
内核为任何一个给定监听套接字维护两个队列:
(1) 未完成连接队列,每个这样的 SYN 报文段对应其中一项:已由某个客户端发出并到达服务器,而服务正在等待完成相应的 TCP 三次握手过程。这些套接字处于SYN_REVD 状态
(2) 已完成连接队列,每个已完成 TCP 三次握手过程的客户端对应其中一项。这些套接字处于 ESTABLISHED 状态

参数
sockfd
sockfd socket 系统调用返回的服务器端 socket 描述符
backlog
backlog 指定在请求队列中允许的最大请求数

4.监听到有客户端接入,接受一个连接

accept()函数

#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

功能
accept 函数由 TCP 服务器调用,用于从已完成连接队列队头回下一个已完成连接。如果已完成连接队列为空,那么进程被投入睡眠。

参数
sockfd
sockfdsocket 系统调用返回的服务器端 socket 描述符
addr
用来返回已连接的对端(客户端)的协议地址
addrled
客户端地址长度
返回值
该函数的返回值是一个新的套接字描术符,返回值是表示已连接的套接字描述待,而第一个参教是服务跟监听套接字描术待。一个服务器通常仅仅创建一个监听套接字,它在该服务器的生命周期内一直存在。内核为每个由服务进程接受的客户连接创建一个已连接套接字(表示 TCP 三次握手已完成),当服务器完成对某个给定客户的服务时,相应的已连接套接字就会被关闭。

5.htons()函数介绍

函数原型是:uint16_t htons(uint16_t hostlong)
其中,hostlong是主机字节顺序表达的16位数,htons中的h–host主机地址,to–to,n–net网络,s–signed long无符号的短整型(32位的系统是2字节);
函数返回值是一个16位的网络字节顺序
函数的作用是将一个16位数从主机字节顺序转换成网络字节顺序简单的说就是把一个16位数高低位呼唤

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

int main()
{
        int s_fd;

        //1.socket
        s_fd = socket(AF_INET,SOCK_STREAM,0);
        if(s_fd == -1)
        {
                perror("socket");
                exit(-1);
        }

        struct sockaddr_in s_addr;
        s_addr.sin_family = AF_INET;
        s_addr.sin_port = htons(8080);
        inet_aton("192.168.0.78",&s_addr.sin_addr);
		
        //2.bind
        bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));

        //3.listen 
        listen(s_fd,10);

        //4.accept
        int c_fd = accept(s_fd,NULL,NULL);

        printf("connect\n");
        while(1);

        return 0;
}

编译运行,输入telnet 192.168.0.78 8080 连接网络

编译结果:

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱嵌入式的小佳同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值