最近学习网络编程相关,学习资源在b站搜索【linux网络编程】。本文章记录相关学习心得。
Socket
- 发送端和接收端成对出现
- 绑定ip + port
- socket为linux中的伪文件
- 一个文件描述符有2个缓冲区,一读一写
sockaddr_in 结构体
struct sockaddr_in {
__kernel_sa_family_t sin_family; /* Address family */ 地址结构类型
__be16 sin_port; /* Port number */ 端口号
struct in_addr sin_addr; /* Internet address */ IP地址
};
struct in_addr {
/* Internet address. */
__be32 s_addr;
};
构建客户端
流程
socket()
函数创建一个socketconnect()
函数与服务器建立连接write()
read()
close()
代码
#include <bits/stdc++.h>
#include <arpa/inet.h> //含有sockaddr_in结构体
#include <ctype.h> // toupper()函数
#include <sys/socket.h> // bind()等函数
#include <unistd.h>
using namespace std;
#define SER_ADDR "127.0.0.1"
int main() {
/**
* 创建一个客户端socket**/
int cli_fd = socket(AF_INET, SOCK_STREAM, 0);
/**
* 定义sockaddr_in结构体**/
struct sockaddr_in ser_addr;
ser_addr.sin_family = AF_INET;
ser_addr.sin_port = htons(6666); // 主机字节序转换为网络字节序port 2B,用short
inet_pton(AF_INET, SER_ADDR, &ser_addr.sin_addr.s_addr); // 关注这个函数的使用
/**
* OS隐式绑定任意一个可用的port,不需要显示写bind()函数**/
/**
* connect()客户端用于建立连接**/
connect(cli_fd, (struct sockaddr *) &ser_addr, sizeof(ser_addr));
/**
* write()和read()函数**/
char buf[BUFSIZ];
while(1) {
fgets(buf, sizeof(buf), stdin); // 从键盘读取字符
write(cli_fd, buf, strlen(buf)); //
int n = read(cli_fd, buf, sizeof(buf)); // 不需要进行网络字节序到主机字节序的转换吗??
write(STDOUT_FILENO, buf, n);