linux下CC++网络编程基本:socket实现tcp和udp的例子

简介: linux下CC++网络编程基本:socket实现tcp和udp的例子

简单的linux下socket编程,分别基于TCP和UDP协议实现的简单程序

linux下socket编程可以概括为以下几个函数的运用:

  • socket()
  • bind()
  • listen()
  • connect()
  • accept()
  • read()
  • write()
  • close()函数

基于TCP实现

流程

server代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
  int server_sockfd;//服务器端套接字
  int client_sockfd;//客户端套接字
  int len;
  struct sockaddr_in my_addr;   //服务器网络地址结构体
  struct sockaddr_in remote_addr; //客户端网络地址结构体
  int sin_size;
  char buf[BUFSIZ];  //数据传送的缓冲区
  memset(&my_addr,0,sizeof(my_addr)); //数据初始化--清零
  my_addr.sin_family=AF_INET; //设置为IP通信
  my_addr.sin_addr.s_addr=INADDR_ANY;//服务器IP地址--允许连接到所有本地地址上
  my_addr.sin_port=htons(8000); //服务器端口号
  /*创建服务器端套接字--IPv4协议,面向连接通信,TCP协议*/
  if((server_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
  {  
    perror("socket error");
    return 1;
  }
  /*将套接字绑定到服务器的网络地址上*/
  if(bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)
  {
    perror("bind error");
    return 1;
  }
  /*监听连接请求--监听队列长度为5*/
  if(listen(server_sockfd,5)<0)
  {
    perror("listen error");
    return 1;
  };
  sin_size=sizeof(struct sockaddr_in);
  /*等待客户端连接请求到达*/
  if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&remote_addr,&sin_size))<0)
  {
    perror("accept error");
    return 1;
  }
  printf("accept client %s
",inet_ntoa(remote_addr.sin_addr));
  len=send(client_sockfd,"Welcome to my server
",21,0);//发送欢迎信息
  /*接收客户端的数据并将其发送给客户端--recv返回接收到的字节数,send返回发送的字节数*/
  while((len=recv(client_sockfd,buf,BUFSIZ,0))>0))
  {
    buf[len]='/0';
    printf("%s
",buf);
    if(send(client_sockfd,buf,len,0)<0)
    {
      perror("write error");
      return 1;
    }
  }
  /*关闭套接字*/
  close(client_sockfd);
  close(server_sockfd);
  return 0;
}

client代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
  int client_sockfd;
  int len;
  struct sockaddr_in remote_addr; //服务器端网络地址结构体
  char buf[BUFSIZ];  //数据传送的缓冲区
  memset(&remote_addr,0,sizeof(remote_addr)); //数据初始化--清零
  remote_addr.sin_family=AF_INET; //设置为IP通信
  remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//服务器IP地址
  remote_addr.sin_port=htons(8000); //服务器端口号
  /*创建客户端套接字--IPv4协议,面向连接通信,TCP协议*/
  if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
  {
    perror("socket error");
    return 1;
  }
  /*将套接字绑定到服务器的网络地址上*/
  if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0)
  {
    perror("connect error");
    return 1;
  }
  printf("connected to server
");
  len=recv(client_sockfd,buf,BUFSIZ,0);//接收服务器端信息
        buf[len]='/0';
  printf("%s",buf); //打印服务器端信息
  /*循环的发送接收信息并打印接收信息(可以按需发送)--recv返回接收到的字节数,send返回发送的字节数*/
  while(1)
  {
    printf("Enter string to send:");
    scanf("%s",buf);
    if(!strcmp(buf,"quit")
      break;
    len=send(client_sockfd,buf,strlen(buf),0);
    len=recv(client_sockfd,buf,BUFSIZ,0);
    buf[len]='/0';
    printf("received:%s
",buf);
  }
  /*关闭套接字*/
  close(client_sockfd);
  return 0;
}

基于UDP实现

流程

server代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
  int server_sockfd;
  int len;
  struct sockaddr_in my_addr;   //服务器网络地址结构体
        struct sockaddr_in remote_addr; //客户端网络地址结构体
  int sin_size;
  char buf[BUFSIZ];  //数据传送的缓冲区
  memset(&my_addr,0,sizeof(my_addr)); //数据初始化--清零
  my_addr.sin_family=AF_INET; //设置为IP通信
  my_addr.sin_addr.s_addr=INADDR_ANY;//服务器IP地址--允许连接到所有本地地址上
  my_addr.sin_port=htons(8000); //服务器端口号
  /*创建服务器端套接字--IPv4协议,面向无连接通信,UDP协议*/
  if((server_sockfd=socket(PF_INET,SOCK_DGRAM,0))<0)
  {  
    perror("socket error");
    return 1;
  }
  /*将套接字绑定到服务器的网络地址上*/
  if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)
  {
    perror("bind error");
    return 1;
  }
  sin_size=sizeof(struct sockaddr_in);
  printf("waiting for a packet...
");
  /*接收客户端的数据并将其发送给客户端--recvfrom是无连接的*/
  if((len=recvfrom(server_sockfd,buf,BUFSIZ,0,(struct sockaddr *)&remote_addr,&sin_size))<0)
  {
    perror("recvfrom error"); 
    return 1;
  }
  printf("received packet from %s:
",inet_ntoa(remote_addr.sin_addr));
  buf[len]='/0';
  printf("contents: %s
",buf);
  /*关闭套接字*/
  close(server_sockfd);
        return 0;
}

client代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
  int client_sockfd;
  int len;
  struct sockaddr_in remote_addr; //服务器端网络地址结构体
  int sin_size;
  char buf[BUFSIZ];  //数据传送的缓冲区
  memset(&remote_addr,0,sizeof(remote_addr)); //数据初始化--清零
  remote_addr.sin_family=AF_INET; //设置为IP通信
  remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//服务器IP地址
  remote_addr.sin_port=htons(8000); //服务器端口号
        /*创建客户端套接字--IPv4协议,面向无连接通信,UDP协议*/
  if((client_sockfd=socket(PF_INET,SOCK_DGRAM,0))<0)
  {  
    perror("socket error");
    return 1;
  }
  strcpy(buf,"This is a test message"); // 发送的内容
  printf("sending: '%s'
",buf); 
  sin_size=sizeof(struct sockaddr_in);
  /*向服务器发送数据包*/
  if((len=sendto(client_sockfd,buf,strlen(buf),0,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr)))<0)
  {
    perror("recvfrom"); 
    return 1;
  }
  /*关闭套接字*/
  close(client_sockfd);
  return 0;
}

在linux下用gcc运行即可

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
相关文章
|
27天前
|
安全 Linux 网络安全
Web安全-Linux网络协议
Web安全-Linux网络协议
52 4
|
1天前
|
网络协议 Linux 网络性能优化
Linux基础-socket详解、TCP/UDP
综上所述,Linux下的Socket编程是网络通信的重要组成部分,通过灵活运用TCP和UDP协议,开发者能够构建出满足不同需求的网络应用程序。掌握这些基础知识,是进行更复杂网络编程任务的基石。
8 1
|
27天前
|
机器学习/深度学习 安全 网络协议
Web安全-Linux网络命令
Web安全-Linux网络命令
19 1
|
23天前
|
网络协议 Linux
Linux 网络配置
了解基本命令与权限后,如何让Linux系统联网?可通过编辑`/etc/sysconfig/network-scripts/`下的`ifcfg-ethX`文件配置网卡,其中`ethX`代表第X块网卡。对于DHCP自动获取或静态IP,需设置`BOOTPROTO`参数,并指定IP、子网掩码和网关等。配置完成后,运行`/etc/init.d/network restart`重启网络。DNS可在`/etc/resolv.conf`中设置,添加`nameserver`行即可,无需重启网卡。配置好后,可用`ifconfig`查看IP信息,并通过远程工具如SecureCRT连接服务器。
44 0
|
1月前
|
域名解析 负载均衡 网络协议
Linux网络接口配置不当所带来的影响
总而言之,Linux网络接口的恰当配置是保证网络稳定性、性能和安全性的基础。通过遵循最佳实践和定期维护,可以最大程度地减少配置错误带来的负面影响。
68 0
|
1月前
|
网络协议 Linux
TCP 和 UDP 的 Socket 调用
【9月更文挑战第6天】
|
3天前
|
安全 网络协议 网络安全
网络安全与信息安全:漏洞、加密与意识的三重奏
【9月更文挑战第32天】在数字世界的交响乐中,网络安全是那不可或缺的乐章。本文将带您深入探索网络安全的三大主题:网络漏洞的识别与防范、加密技术的奥秘以及安全意识的重要性。通过深入浅出的方式,我们将一起揭开这些概念的神秘面纱,并学习如何在实际生活中应用它们来保护自己的数字足迹。让我们开始这场既刺激又富有教育意义的旅程,提升个人和组织的网络安全防御能力。
|
1天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【9月更文挑战第34天】在数字化时代,网络安全与信息安全的重要性日益凸显。本文将探讨网络安全漏洞、加密技术以及安全意识等关键方面,旨在提升读者对网络安全防护的认识和理解。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调培养良好的安全意识的必要性,本文旨在为读者提供实用的知识和建议,以应对日益复杂的网络威胁。
|
1天前
|
安全 算法 网络安全
网络安全的盾牌:从漏洞到加密,构筑信息安全长城
【9月更文挑战第34天】在数字时代的浪潮中,网络安全成为保护个人和组织数据不受侵犯的关键。本文将深入探讨网络安全中的漏洞发现、利用与防范,介绍加密技术的原理与应用,并强调培养安全意识的重要性。我们将通过实际代码示例,揭示网络攻防的复杂性,并提供实用的防护策略,旨在提升读者对网络安全的认识和应对能力。
28 10
|
2天前
|
存储 安全 算法
网络安全与信息安全:漏洞、加密与意识的三维防线
【9月更文挑战第33天】在数字化浪潮中,网络安全与信息安全成为守护数据宝藏的坚固盾牌。本文将深入探讨网络防御的三大支柱:安全漏洞的识别与防范,加密技术的应用和原理,以及提升个人和组织的安全意识。通过这些知识的分享,我们旨在为读者提供一套全面的网络安全策略,确保数字资产的安全无虞。
下一篇
无影云桌面