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

相关文章
|
网络协议 安全 Linux
Linux C/C++之IO多路复用(select)
这篇文章主要介绍了TCP的三次握手和四次挥手过程,TCP与UDP的区别,以及如何使用select函数实现IO多路复用,包括服务器监听多个客户端连接和简单聊天室场景的应用示例。
317 0
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
598 1
Linux C/C++之IO多路复用(aio)
|
资源调度 Linux 调度
Linux c/c++之进程基础
这篇文章主要介绍了Linux下C/C++进程的基本概念、组成、模式、运行和状态,以及如何使用系统调用创建和管理进程。
152 0
|
9月前
|
网络协议 算法 安全
Go语言的网络编程与TCP_UDP
Go语言由Google开发,旨在简单、高效和可扩展。本文深入探讨Go语言的网络编程,涵盖TCP/UDP的基本概念、核心算法(如滑动窗口、流量控制等)、最佳实践及应用场景。通过代码示例展示了TCP和UDP的实现,并讨论了其在HTTP、DNS等协议中的应用。最后,总结了Go语言网络编程的未来发展趋势与挑战,推荐了相关工具和资源。
266 5
|
Web App开发 缓存 网络协议
不为人知的网络编程(十八):UDP比TCP高效?还真不一定!
熟悉网络编程的(尤其搞实时音视频聊天技术的)同学们都有个约定俗成的主观论调,一提起UDP和TCP,马上想到的是UDP没有TCP可靠,但UDP肯定比TCP高效。说到UDP比TCP高效,理由是什么呢?事实真是这样吗?跟着本文咱们一探究竟!
399 10
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
2281 3
|
资源调度 Linux 调度
Linux C/C++之线程基础
这篇文章详细介绍了Linux下C/C++线程的基本概念、创建和管理线程的方法,以及线程同步的各种机制,并通过实例代码展示了线程同步技术的应用。
213 0
Linux C/C++之线程基础
|
Linux C++
Linux C/C++之IO多路复用(poll,epoll)
这篇文章详细介绍了Linux下C/C++编程中IO多路复用的两种机制:poll和epoll,包括它们的比较、编程模型、函数原型以及如何使用这些机制实现服务器端和客户端之间的多个连接。
400 0
Linux C/C++之IO多路复用(poll,epoll)
|
网络协议 Linux 网络性能优化
Linux C/C++之TCP / UDP通信
这篇文章详细介绍了Linux下C/C++语言实现TCP和UDP通信的方法,包括网络基础、通信模型、编程示例以及TCP和UDP的优缺点比较。
533 0
Linux C/C++之TCP / UDP通信
|
消息中间件 Linux API
Linux c/c++之IPC进程间通信
这篇文章详细介绍了Linux下C/C++进程间通信(IPC)的三种主要技术:共享内存、消息队列和信号量,包括它们的编程模型、API函数原型、优势与缺点,并通过示例代码展示了它们的创建、使用和管理方法。
284 0
Linux c/c++之IPC进程间通信