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

相关文章
|
网络协议 安全 API
WebSocket、Socket、TCP 和 HTTP 的差别与应用场景
WebSocket、Socket、TCP 和 HTTP 是网络通信中的四大“使者”,各具特色:HTTP 适合短时请求,TCP 稳定可靠,Socket 灵活定制,WebSocket 实现实时双向通信。本文用通俗语言解析它们的区别与应用场景,助你为项目选择最合适的通信方式。
3477 3
|
Kubernetes 网络协议 Python
Python网络编程:从Socket到Web应用
在信息时代,网络编程是软件开发的重要组成部分。Python作为多用途编程语言,提供了从Socket编程到Web应用开发的强大支持。本文将从基础的Socket编程入手,逐步深入到复杂的Web应用开发,涵盖Flask、Django等框架的应用,以及异步Web编程和微服务架构。通过本文,读者将全面了解Python在网络编程领域的应用。
417 1
|
网络协议 Linux 网络性能优化
Linux C/C++之TCP / UDP通信
这篇文章详细介绍了Linux下C/C++语言实现TCP和UDP通信的方法,包括网络基础、通信模型、编程示例以及TCP和UDP的优缺点比较。
1025 0
Linux C/C++之TCP / UDP通信
|
网络协议 Linux 网络性能优化
Linux基础-socket详解、TCP/UDP
综上所述,Linux下的Socket编程是网络通信的重要组成部分,通过灵活运用TCP和UDP协议,开发者能够构建出满足不同需求的网络应用程序。掌握这些基础知识,是进行更复杂网络编程任务的基石。
734 1
|
网络协议 Python
告别网络编程迷雾!Python Socket编程基础与实战,让你秒变网络达人!
在网络编程的世界里,Socket编程是连接数据与服务的关键桥梁。对于初学者,这往往是最棘手的部分。本文将用Python带你轻松入门Socket编程,从创建TCP服务器与客户端的基础搭建,到处理并发连接的实战技巧,逐步揭开网络编程的神秘面纱。通过具体的代码示例,我们将掌握Socket的基本概念与操作,让你成为网络编程的高手。无论是简单的数据传输还是复杂的并发处理,Python都能助你一臂之力。希望这篇文章成为你网络编程旅程的良好开端。
330 3
|
网络协议 开发者 Python
网络编程小白秒变大咖!Python Socket基础与进阶教程,轻松上手无压力!
在网络技术飞速发展的今天,掌握网络编程已成为开发者的重要技能。本文以Python为工具,带你从Socket编程基础逐步深入至进阶领域。首先介绍Socket的概念及TCP/UDP协议,接着演示如何用Python创建、绑定、监听Socket,实现数据收发;最后通过构建简单的聊天服务器,巩固所学知识。让初学者也能迅速上手,成为网络编程高手。
448 1
|
存储 网络协议 安全
C语言 网络编程(五)Socket和端口
Socket 是 TCP/IP 五层网络模型中应用层的编程接口,用于实现不同主机间应用程序的双向通信。它作为网络通信的端点,连接应用层与网络协议栈,提供可靠的流式或非流式数据传输服务。Socket 包括流式(SOCKET_STREAM)、数据报(SOCK_DGRAM)和原始套接字(SOCK_RAW)三种类型,分别适用于不同场景。通过 IP 地址和端口号,Socket 能准确识别并转发数据包至指定进程。端口号分为知名端口(1-1023)、注册端口(1024-49151)和动态端口(49152-65535),确保数据准确交付。
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
309 0
|
网络协议 Linux
TCP 和 UDP 的 Socket 调用
【9月更文挑战第6天】
|
网络协议 开发者 Python
深度探索Python Socket编程:从理论到实践,进阶篇带你领略网络编程的魅力!
【7月更文挑战第25天】在网络编程中, Python Socket编程因灵活性强而广受青睐。本文采用问答形式深入探讨其进阶技巧。**问题一**: Socket编程基于TCP/IP,通过创建Socket对象实现通信,支持客户端和服务器间的数据交换。**问题二**: 提升并发处理能力的方法包括多线程(适用于I/O密集型任务)、多进程(绕过GIL限制)和异步IO(asyncio)。**问题三**: 提供了一个使用asyncio库实现的异步Socket服务器示例,展示如何接收及响应客户端消息。通过这些内容,希望能激发读者对网络编程的兴趣并引导进一步探索。
430 4