一. Udp套路:
第一步:创建套接字
第二步:配置服务器地址信息
第三步:绑定套接字
cpp
void init()
{
_socketfd = socket(AF_INET,SOCK_DGRAM,0);//第一步 创建套接字
//AF_INET:使用IPv4协议
//SOCK_DGRAM就是数据报
// UDP - 不需要建立连接
// 直接发送数据,无需connect()
struct sockaddr_in addr;//第二步 配置服务器地址信息
memset(&addr,0,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(_port);
addr.sin_addr.s_addr = INADDR_ANY;
socklen_t size = sizeof(addr);
if(bind(_socketfd,(struct sockaddr*)&addr,size) < 0)//第三步 绑定套接字
{
LOG(level::FATAL)<<"bind false";
exit(1);
}
LOG(level::INFO)<<"bind success";
}
就可以运行了
cpp
void start()
{
while(1)
{
char buff[512];
struct sockaddr_in addrin;
socklen_t sizein = sizeof(addrin);
ssize_t n = recvfrom(_socketfd,buff,sizeof(buff)-1,0,(struct sockaddr*)&addrin,&sizein);//从套接字中获取信息
if(n > 0)
{
buff[n] = 0;
LOG(level::DEBUG)<<buff;
std::string message;
message = "server say# ";
message += buff;
ssize_t m = sendto(_socketfd,message.c_str(),message.size(),0,(struct sockaddr*)&addrin, sizein);//从套接字中发送信息
}
}
}
二.Tcp套路:
-
创建Socket
-
绑定地址
-
开始监听
cpp
void Init()
{
_listenfd = socket(AF_INET,SOCK_STREAM,0);//第一步 获取监听套接字
//SOCK_STREAM 数据流
if(_listenfd < 0)
{
LOG(level::FATAL)<<"Socket false";
exit(SOCKER_ERR);
}
LOG(level::INFO)<<"socket success "<<_listenfd;
Inetaddr saddr(_port);
int n = bind(_listenfd,(const struct sockaddr*)&saddr.Getaddr(),sizeof(saddr.Getaddr()));//第二步 绑定服务端
if(n == -1)
{
LOG(level::FATAL)<<"bind false";
exit(BIND_ERR);
}
if(listen(_listenfd,defbacklog) < 0)//第三步 监听
{
LOG(level::FATAL)<<"listen false";
exit(LISTEN_ERR);
}
}
- accept 从监听listen fd获取远端的套接字
cpp
while(_Isrunning)
{
struct sockaddr_in peer;//建立远端来接受远端信息
socklen_t sz = sizeof(peer);
int sfd = accept(_listenfd,(sockaddr*)&peer,&sz);
//从监听fd获取远端的套接字
if(sfd < 0)
{
LOG(level::ERROR)<<"accept false";
exit(ACCEPT_ERR);
}
LOG(level::DEBUG)<<"accept success "<<sfd;
Inetaddr local(peer);
//下面是我自己线程的执行,不用理
ThreadData* thdata = new ThreadData(sfd,local,this);
pthread_t th1;
pthread_create(&th1,nullptr,Routine,thdata);
}