套接字编程2

编写udp服务端的通信程序( c语言 )

 #include <stdio.h>
 #include <unistd.h>
 #include <arpa/inet.h>//字节序转换接口头文件
 #include <netinet/in.h>//地址结构头,协议类型文件
 #include <sys/socket.h>//套接字接口文件

 int main(){
 //1.创建套接字
 //int socket(地址域类型, 套接字类型, 协议类型)
 int sockfd=sock(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
 if(sockfd<0){
 perror("socket error");
 return -1;
 }
 //2.为套接字绑定地址信息
 //int bind(套接字描述符, 地址信息, 地址长度)
 struct sockaddr_in addr;//定义IPv4地址结构
 addr.sin_family=AF_INET;
 addr.sin_port=htons(9000);//设置地址端口
 addr.sin_addr.s_addr=inet_addr("118.25.4.5");
 int len=sizeof(addr);
 int ret=bind(sockfd,(struct sockaddr*)&addr,len);
 if(ret<0){
 perror("bind error");
 return -1;
 }
 while(1){
 //3.接收数据
 //recvfrom(句柄,空间,长度,标志,对端地址,地址长度)
 char buf[1024]={0};
 struct sockaddr_in paddr;
 int len=sizeof(struct sockaddr_in);
 ret=recvfrom(sockfd,buf,103,0,
 (struct sockaddr*)&padrr,&len);
 if(ret<0){

 perror("recvfrom error");
 return -1;
 }
 uint16_t cport=ntohs(paddr.sin_port );
 char *cip=ient_ntoa(paddr.sin_addr);
 printf("client-[%s:%d] say: %s\n",cport,cip,buf);
 //4.回复数据
 memset(buf,0x00,1024);
 printf("server say: ");
 fflush(stdout);
 fgets(buf,1023,stdin);
 ret=sendto(sockfd,buf,strlen(buf),0
 (struct sockaddr*)&paddr,len);
 if(ret<0){
 perror("sendto error");
 return -1;
 }
}
 //5.关闭套接字
 close(sockfd);
 return 0;
 }

 

编写udp客户端的通信程序( c++语言 )

 //封装实现一个udpsocket类
 //通过实例化的对象调用对应的成员接口.
 //可以实现udp客户端或服务端的搭建
 //
 
 #include<cstdio>
 #include<iostream>
 #include<string>
 #include<unistd.h>
 #include<arpa/inet.h>
 #include<netinet/in.h>
 #include<sys/socket.h>

 class UdpSocket{
 private:
 int _sockfd;
 public:
 UdpSocket():_sockfd(-1){}
 bool Socket(){
_sockfd=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
 if(_sockfd<0){
 perror("socket error");
 return false;
 }
 return true;
 }
 bool Bind(std::string &ip,uint16_t port){
 struct sockaddr_in addr;
 addr.sin_family=AF_INET;
 addr.sin_port=htons(port);
 addr.sin_addr.s_addr=inet_addr(ip.c_str());
 socklen_t len=sizeof(struct sockaddr_in);
 int ret;
 ret=bind(_sockfd,(struct sockaddr*)&addr,len);
 if(ret<0){
 perror("bind error");
 return false;
}
 return true;
 }
 bool Send(std::string &data,std::string &ip,int port){
 struct sockaddr_in addr;
 addr.sin_family=AF_INET;
 addr.sin_port=htons(port);
 addr.sin_addr.s_addr=inet_addr(ip.c_str());
 socklen_t len=sizeof(struct sockaddr_in);
 int ret=sendto(_sockfd,data.c_str(),data.size(),0,(sockaddr*)&addr.len);
 if(ret<0){
 perror("sendto error");
 return false;
 }
 return true;
 }
 bool Recv(std::string *buf,std::string *ip=NULL,int *port=NULL){
 strucr sockaddr_in addr;
 socklen_t len=sizeof(struct sockaddr_in);
 char tmp[4096]={0};
 int ret=recvfrom(_sock,tmp,4096,0,(sockaddr*)&addr,&len);
 if(ret<0){
 perror("recvfrom error");
 return false;
 }
 buf->assign(tmp,ret);//自带申请空间数据拷贝
 if(ip!=NULL){
    *ip=inet_ntoa(addr.sin_addr);
 }
 if(port!=NULL){
 *port=ntohs(addr.sin_port);
 }
 return true;
 }
 bool Close(){
 if(_sockfd!=-1){
 close(_sockfd);
 }
 return true;
 }
 };

 

上一篇:centos7磁盘挂载与卸载


下一篇:Linux C实现简单,多进程,多线程服务器