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 8迁移Anolis OS 8
Anolis OS 8在做出差异性开发同时,在生态上和依赖管理上保持跟CentOS 8.x兼容,本文为您介绍如何通过AOMS迁移工具实现CentOS 8.x到Anolis OS 8的迁移。
相关文章
|
5天前
|
安全 Ubuntu Linux
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
22 0
Nipper 3.8.0 for Windows & Linux - 网络设备漏洞评估
|
2月前
|
Ubuntu Linux
Linux系统管理:服务器时间与网络时间同步技巧。
以上就是在Linux服务器上设置时间同步的方式。然而,要正确运用这些知识,需要理解其背后的工作原理:服务器根据网络中的其他机器的时间进行校对,逐步地精确自己的系统时间,就像一只犹豫不决的啮齿动物,通过观察其他啮齿动物的行为,逐渐确定自己的行为逻辑,既简单,又有趣。最后希望这个过程既能给你带来乐趣,也能提高你作为系统管理员的专业素养。
132 20
|
2月前
|
JSON 运维 Ubuntu
Linux下如何使用Curl进行网络请求
希望这篇文章能帮助您在Linux下更好地使用Curl进行网络请求。如有疑问,请随时提问!
115 10
|
3月前
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
90 16
|
4月前
|
Linux 网络性能优化 网络安全
Linux(openwrt)下iptables+tc工具实现网络流量限速控制(QoS)
通过以上步骤,您可以在Linux(OpenWrt)系统中使用iptables和tc工具实现网络流量限速控制(QoS)。这种方法灵活且功能强大,可以帮助管理员有效管理网络带宽,确保关键业务的网络性能。希望本文能够为您提供有价值的参考。
475 28
|
4月前
|
网络协议 Unix Linux
深入解析:Linux网络配置工具ifconfig与ip命令的全面对比
虽然 `ifconfig`作为一个经典的网络配置工具,简单易用,但其功能已经不能满足现代网络配置的需求。相比之下,`ip`命令不仅功能全面,而且提供了一致且简洁的语法,适用于各种网络配置场景。因此,在实际使用中,推荐逐步过渡到 `ip`命令,以更好地适应现代网络管理需求。
128 11
|
4月前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
243 15
|
5月前
|
Ubuntu Unix Linux
Linux网络文件系统NFS:配置与管理指南
NFS 是 Linux 系统中常用的网络文件系统协议,通过配置和管理 NFS,可以实现跨网络的文件共享。本文详细介绍了 NFS 的安装、配置、管理和常见问题的解决方法,希望对您的工作有所帮助。通过正确配置和优化 NFS,可以显著提高文件共享的效率和安全性。
675 7
|
6月前
|
域名解析 网络协议 安全

热门文章

最新文章