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运行即可

相关文章
|
10月前
|
安全 Linux 网络安全
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
273 0
Nipper 3.9.0 for Windows & Linux - 网络设备漏洞评估
|
11月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
697 18
|
11月前
|
网络协议 关系型数据库 Linux
【App Service Linux】在Linux App Service中安装 tcpdump 并抓取网络包
在App Service for Linux环境中,无法像Windows一样直接使用网络排查工具抓包。本文介绍了如何通过TCPDUMP在Linux环境下抓取网络包,包括SSH进入容器、安装tcpdump、执行抓包命令及下载分析文件的完整操作步骤。
516 5
|
Web App开发 网络协议 Linux
【Linux】网络基础
TCP/IP五层模型是网络通信的基础框架,将复杂的数据传输过程分为物理层、数据链路层、网络层、传输层和应用层,每层各司其职,协同完成远程通信。该模型确保了不同设备和网络之间的互联互通,是现代互联网运行的核心机制。
1372 5
|
网络协议 Linux 开发者
深入Linux中UDP网络通信机制编程探索
以上步骤概述了Linux中UDP网络通信的编程机制。在实现时,因关注细节和上下文环境可能有所调整,但大致流程是一致的。这些知识片段旨在帮助开发者快速上手Linux下的UDP编程,并提供可靠的信息作为编程的基础。在编程实践中,应结合实际业务需求,设计合适的数据传输协议,确保数据的正确性和实时性。
257 0
|
SQL 监控 安全
网络安全与信息安全:漏洞、加密与安全意识
随着互联网的迅猛发展,网络安全和信息安全问题日益受到关注。本文深入探讨了网络安全漏洞、加密技术以及提高个人和组织的安全意识的重要性。通过分析常见的网络攻击手段如缓冲区溢出、SQL注入等,揭示了计算机系统中存在的缺陷及其潜在威胁。同时,详细介绍了对称加密和非对称加密算法的原理及应用场景,强调了数字签名和数字证书在验证信息完整性中的关键作用。此外,还讨论了培养良好上网习惯、定期备份数据等提升安全意识的方法,旨在帮助读者更好地理解和应对复杂的网络安全挑战。
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
521 17
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
391 10
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
381 10

热门文章

最新文章