linux网络编程socket

一些关于网络编程的知识点:
TCP连接发送的数据,无差错,不丢失,不重复,且按序到达
UDP尽最大努力交付,既不保证可靠交付

字节序:指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序
常见序:Little endian小端字节序
Big endian大端字节序
网络字节序是大端字节序

socket(建立一个socket通信):

需要的头文件:
#include <sys/types.h>
#include <sys/socket.h>
参数原型:int socket(int domain, int type, int protocol);
domain:
AF_INET:IPv4协议
AF_INET6:IPv6协议
AF_LOCAL:UNIX域协议
AF_ROUTE:路由套接字
AF_KEY:密钥套接字
type:
SOCK_STREAM:字节流套接字socket
SOCK_DGRAM:数据报套接字socket
SOCK_RAW:原始套接字socket
protocol:0(原始套接字除外)
例如:s_fd = socket(AF_INET,SOCK_STREAM,0);
返回值:非负套接字描述符
出错返回-1

bind(对socket定位):

需要的头文件:
#include <sys/types.h>
#include <sys/socket.h>
参数原型:int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
sockfd:套接字描述符
addr:是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针,指向要绑定给sockfd的协议地址结构,这个地址结构根据地址创建socket时的地址协议族的不同而不同。
ipv4对应的是:
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结构在内存中对齐,这样两者才能互相转换
};

addrlen:地址长度
*例如:
struct sockaddr_in s_addr;
memset(&s_addr,0,sizeof(struct sockaddr_in));
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&s_addr.sin_addr);
bind(s_fd,(struct sockaddr )&s_addr,sizeof(struct sockaddr_in));

返回值:成功返回0
失败返回-1

listen(等待连接):

需要的头文件:
#include <sys/types.h>
#include <sys/socket.h>
参数原型:int listen(int sockfd, int backlog);
sockfd:套接字描述符
backlog:请求队列中允许的最大请求数,大多数系统默认值为5
例如: listen(s_fd,10);
返回值:成功返回0
失败返回-1

accept(接受socket连线):

需要的头文件:
#include <sys/types.h>
#include <sys/socket.h>
参数原型:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
sockfd:套接字描述符
addr:客户端地址
addrlen:地址长度
例如:
struct sockaddr_in c_addr;
memset(&c_addr,0,sizeof(struct sockaddr_in));
int len = sizeof(struct sockaddr_in);
c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&len);
返回值:成功返回0
失败返回-1

connect(建立socket连线):

需要的头文件:
#include <sys/types.h>
#include <sys/socket.h>
参数原型:int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockfd:套接字描述符
**addr:是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针,指向要绑定给sockfd的协议地址结构,这个地址结构根据地址创建socket时的地址协议族的不同而不同。
ipv4对应的是:
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结构在内存中对齐,这样两者才能互相转换
};

addrlen:地址长度
*例如:
struct sockaddr_in c_addr;
memset(&c_addr,0,sizeof(struct sockaddr_in));
c_addr.sin_family = AF_INET;
c_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&c_addr.sin_addr);
connect(c_fd,(struct sockaddr )&c_addr,sizeof(struct sockaddr));

返回值:成功返回0
失败返回-1

服务端操作:

1.连接协议socket
2.地址准备好bind
3.监听listen
4.连接accept
在这里插入图片描述

在这里插入图片描述

客户端操作:

1.连接协议socket
2.客户连接主机connect
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值