目录
只有认知的突破 💫才能带来真正的成长 💫编程技术的学习 💫没有捷径 💫一起加油💫

🍁感谢各位的观看 🍁欢迎大家留言 🍁咱们一起加油 🍁努力成为更好的自己🍁
网络Socket通信
Socket函数集合
TCP和UDP通信,所需的函数如下所示,就这几个函数。
cpp
// 创建 socket ⽂件描述符 (TCP/UDP, 客⼾端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端⼝号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address, socklen_t address_len);
// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address, socklen_t* address_len);
// 建⽴连接 (TCP, 客⼾端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
UDP通信
步骤:创建socket套接字------>绑定bind------>通信
函数:int socket(int domain, int type, int protocol),创建套接字。
-
参数
-
int domain
-
AF_UNIX,AF_LOCAL:本地通信。 -
AF_INET:IPv4 网络通信。
-
-
int type
-
SOCK_STREAM:用于TCP通信。 -
SOCK_DGRAM:用于UDP通信。
-
-
int protocol:默认为0即可。
-
-
返回值
它创建成功返回一个"文件描述符",socket_fd,否则-1。
函数:int bind(int socket, const struct sockaddr *address, socklen_t address_len)
用来绑定IP和端口号的。
使用sendto()和recvfrom()函数继续通信,也可以使用write()和read()函数通信 。
UdpServer.hpp
cpp
#pragma once
#include <iostream>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
uint16_t def_port=-1;
class UdpServer{
public:
UdpServer(uint16_t port=def_port):_port(port),_isrunning(false){}
void Init()
{
//创建套接字
_socket=socket(AF_INET,SOCK_DGRAM,0);
if(_socket<0){
std::cout<<"Sever make socket failed !"<<std::endl;
exit(1);
}
std::cout<<"Sever make socket sucess !"<<std::endl;
//进行bind
struct sockaddr_in cp;
memset(&cp,0,sizeof(cp)); //清空
cp.sin_family=AF_INET;
cp.sin_port=htons(_port);
cp.sin_addr.s_addr=INADDR_ANY; //绑定任意IP
int n=bind(_socket,(struct sockaddr*)(&cp),sizeof(cp));
if(n<0){std::cout<<"Sever bind failed !"<<std::endl;exit(2);}
std::cout<<"Sever bind sucess !"<<std::endl;
}
void Start()
{
_isrunning=true;
std::cout<<"Sever Start sucess !"<<std::endl;
//接收消息
while(_isrunning)
{
char inbuffer[1024]={0};
inbuffer[0]=0;//清空缓冲区
struct sockaddr_in vip;
memset(&vip,0,sizeof(vip)); //清空
socklen_t m=sizeof(vip);
ssize_t num=recvfrom(_socket,inbuffer,sizeof(inbuffer),0,(struct sockaddr*)(&vip),&m);
inbuffer[num]=0;
std::cout<<"@Server:"<<inbuffer<<std::endl;
}
}
void Stop()
{
_isrunning=false;
std::cout<<"Sever Stop sucess !"<<std::endl;
}
~UdpServer(){}
private:
int _socket;
uint16_t _port;
bool _isrunning;
};
UdpServer.cc
cpp
#include "UdpServer.hpp"
int main(int argc,char*argv[])
{
uint16_t port=std::stoi(argv[1]); //绑定端口号
UdpServer ud(port);
ud.Init();
ud.Start();
return 0;
}
UdpClient.cc
cpp
#include <iostream>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <string>
int main(int argc,char*argv[])
{
// 创建套接字
int fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0)
{
std::cout << "Client make socket failed !" << std::endl;
exit(1);
}
std::cout << "Client make socket sucess !" << std::endl;
uint16_t port=std::stoi(argv[2]);
std::string ip=argv[1];
struct sockaddr_in cp;
memset(&cp, 0, sizeof(cp)); // 清空
cp.sin_family = AF_INET;
cp.sin_port = htons(port);
cp.sin_addr.s_addr=inet_addr(ip.c_str());
//客户端不需要绑定自己的IP和端口号
while(true)
{
std::string messge;
getline(std::cin,messge);
sendto(fd,messge.c_str(),messge.size(),0,(struct sockaddr*)(&cp),sizeof(cp));
std::cout<<messge<<std::endl;
}
return 0;
}
