ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

套接字编程2

2021-06-01 22:36:04  阅读:186  来源: 互联网

标签:addr int 编程 sockfd 接字 include port


编写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;
 }
 };

 

标签:addr,int,编程,sockfd,接字,include,port
来源: https://www.cnblogs.com/enjoyC/p/14828591.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有