socket网络编程(c++)

本文介绍了C++中进行socket网络编程的基础知识,包括Internet套接字的分类(如TCP的流格式和UDP的数据包格式),socket相关结构体如socket描述符和地址结构,以及服务器和客户端的交互过程,涉及到socket创建、bind、listen、connect和accept等关键函数。并提供简单的服务端和客户端实例。
摘要由CSDN通过智能技术生成


前言

本文内容分两个部分: socket编程基础知识 与 简单实例。

提示:阅读前有一定计算机网络知识的基础

一、基础知识

1.Internet套接字

【介绍】
应用层 与 传输层 的通道,由ip地址 + 端口号
【分类】
流格式(stream sockets)
sock_stream: 全双工可靠面向连接的传输,tcp
数据包格式(datagram socket)
sock_dgram: 无连接传输,速度更快,udp

2.socket相关结构体

  1. socket描述符:int类型
    注意:网络字节顺序(Network Byte Order)与 本机字节顺序(Host Byte Order)
  2. struct sockaddr:
struct sockaddr {
   
  unsigned short sa_family; //协议族
  char sa_data[14]; //协议地址
};
  1. struct sockaddr_in:与sockaddr等价,常用
struct sockaddr_in {
   
  short int sin_family; //通信类型
  unsigned short int sin_port; //端口
  struct in_addr sin_addr; //ip
  unsigned char sin_zero[8]; //同sockaddr长度相同
};
  1. struct in_addr:
struct in_addr {
   
  unsigned long s_addr;
};
  1. 本机转换
    n:网络顺序,h:本机顺序,s:short,l:long
    htons()–“Host to Network Short”
    htonl()–“Host to Network Long”
    ntohs()–“Network to Host Short”
    ntohl()–“Network to Host Long”
    注:
    本机字节顺序:与cpu架构有关,x86为小端序
    网络字节顺序:大端序
  2. ip地址类型转换
    p or a:表达形式(ascii字符串)
    n:数值形式(二进制数–存在struct in_addr中)
/*1.字符串转化为数值 inet_addr()
注:input=255.255.255.255,output=-1*/
ina.sin_addr.s_addr = inet_addr("132.241.5.10");
/*2.地址形式转化为字符串 ntoa()
注:每次调用会覆盖上次调用*/
printf("%s",inet_ntoa(ina.sin_addr));
/*3.新型转化函数:兼容ipv4,ipv6
*/
int inet_pton(int family, const char *strptr, void *addrptr);    
//将表达形式(字符串)转化为数值格式(结构体)
//返回值:若成功则为1,若输入不是有效的表达式则为0,若出错则为-1
 
const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t len);     
//将数值格式
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Socket编程是一种用于网络通信的常见编程技术。在C++中,可以使用标准库中的socket API来实现Socket编程。以下是一个简单的Socket服务器和客户端示例。 服务器端: ```c++ #include <iostream> #include <sys/socket.h> #include <netinet/in.h> #include <cstring> #include <unistd.h> int main() { int server_fd, new_socket, valread; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); char buffer[1024] = {0}; const char* hello = "Hello from server"; // 创建Socket文件描述符 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { std::cerr << "socket failed" << std::endl; return -1; } // 设置Socket选项 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { std::cerr << "setsockopt failed" << std::endl; return -1; } // 绑定Socket到指定端口 address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(8080); if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) { std::cerr << "bind failed" << std::endl; return -1; } // 监听Socket,等待客户端连接 if (listen(server_fd, 3) < 0) { std::cerr << "listen failed" << std::endl; return -1; } // 接受客户端连接 if ((new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen)) < 0) { std::cerr << "accept failed" << std::endl; return -1; } // 从客户端接收数据 valread = read(new_socket, buffer, 1024); std::cout << buffer << std::endl; // 向客户端发送数据 send(new_socket, hello, strlen(hello), 0); std::cout << "Hello message sent" << std::endl; // 关闭Socket连接 close(new_socket); close(server_fd); return 0; } ``` 客户端: ```c++ #include <iostream> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <cstring> #include <unistd.h> int main() { int sock = 0, valread; struct sockaddr_in serv_addr; char buffer[1024] = {0}; const char* hello = "Hello from client"; // 创建Socket文件描述符 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { std::cerr << "socket failed" << std::endl; return -1; } // 设置服务器地址 serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(8080); if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) { std::cerr << "inet_pton failed" << std::endl; return -1; } // 连接服务器 if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) { std::cerr << "connect failed" << std::endl; return -1; } // 向服务器发送数据 send(sock, hello, strlen(hello), 0); std::cout << "Hello message sent" << std::endl; // 从服务器接收数据 valread = read(sock, buffer, 1024); std::cout << buffer << std::endl; // 关闭Socket连接 close(sock); return 0; } ``` 在这个示例中,服务器和客户端都使用了`socket()`函数创建Socket文件描述符,然后使用`bind()`和`listen()`函数在服务器端绑定Socket到指定端口并开始监听,等待客户端连接。客户端使用`connect()`函数连接服务器。一旦连接成功,客户端就可以向服务器发送数据,服务器接收数据并做出响应,最后关闭Socket连接。 这只是一个简单的示例,Socket编程还有更多的细节需要处理,例如错误处理和多个客户端连接等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值