您现在的位置是:首页 >其他 >【网络编程】实现UDP/TCP客户端、服务器网站首页其他
【网络编程】实现UDP/TCP客户端、服务器
简介【网络编程】实现UDP/TCP客户端、服务器
目录
一、UDP
1、Linux客户端、服务器
1.1udpServer.hpp
#pragma once
#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include <cerrno>
#include <cstring>
#include <cstdlib>
#include <arpa/inet.h>
#include <strings.h>
#include <functional>
namespace Server
{
const static string defaultIp="0.0.0.0";//缺省的IP
const static int gnum=1024;
typedef function<void(int,string,uint16_t,string)> func_t;
enum
{
USAGE_ERR=1,
SOCKET_ERR,
BIND_ERR,
OPEN_ERR,
};
class udpServer
{
public:
udpServer(const func_t& callback,const uint16_t& port,const string& ip=defaultIp)
:_callback(callback)//udpServer.cc传入的对客户端数据处理的函数
,_port(port)
,_ip(ip)
,_sockfd(-1)
{}
void initServer()
{
//1、创建socket
_sockfd=socket(AF_INET,SOCK_DGRAM,0);//网络通信+数据报
if(-1==_sockfd)
{
cout<<"socket error"<<errno<<":"<<strerror(errno)<<endl;
exit(SOCKET_ERR);
}
cout<<"socket success"<<":"<<_sockfd<<endl;
//2、绑定IP和端口号
struct sockaddr_in local;
bzero(&local,sizeof(local));//将一段内存初始化为全0
local.sin_family=AF_INET;//协议族设置为网络通信
local.sin_port=htons(_port);//设置端口号,需要转为大端,主机转网络
local.sin_addr.s_addr=inet_addr(_ip.c_str());//将IP字符串转uint32_t的同时转为网络字节序
//local.sin_addr.s_addr=htonl(INADDR_ANY);//INADDR_ANY就是0,表明任何IP都可以访问这个服务器的_port端口
int n=bind(_sockfd,(struct sockaddr*)&local,sizeof(local));
if(-1==n)
{
cout<<"bind error"<<errno<<":"<<strerror(errno)<<endl;
exit(BIND_ERR);
}
}
void start()
{
char buffer[gnum];
while(1)
{
//循环读取数据
struct sockaddr_in local;//输出型参数
socklen_t len=sizeof(local);//必填
size_t s=recvfrom(_sockfd,buffer,sizeof(buffer)-1,0,(struct sockaddr*)&local,&len);//阻塞式读取
//这里需要关心1、数据是什么2、数据是谁发的
if(s>0)
{
buffer[s]=0;//加上'