Linux中使用C语言实现基于UDP协议的Socket通信示例

linux下udp服务器端源码示例:

#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h> 

int main(int argc, char **argv)
{
 printf("server ip: %s/n", argv[1]);
 printf("server port: %s/n", argv[2]); 

 printf("/n service starting.../n/n");
 int  socketFd;
 struct sockaddr_in svrAddr;
 struct sockaddr_in localAddr; 

 socketFd = socket (AF_INET, SOCK_DGRAM, 0);
 if ( -1 == socketFd )
 {
  perror( "socket:" );
  exit(-1);
 } 

 // 设置地址可复用
 int option = 1;
 setsockopt( socketFd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option) );
 // 客户端IP
 memset(&localAddr, 0, sizeof(localAddr));
 localAddr.sin_family = AF_INET;
 localAddr.sin_addr.s_addr = inet_addr( argv[1]);
 localAddr.sin_port = htons (atoi(argv[2])); 

 int bindResult = bind(socketFd, (struct sockaddr *) &localAddr, sizeof(localAddr));
 if ( -1 == bindResult )
 {
  perror( "bind:" );
  close(socketFd);
  exit(-1);
 } 

 // 服务器IP
 memset(&svrAddr, 0, sizeof(svrAddr));
 svrAddr.sin_family = AF_INET;
 svrAddr.sin_addr.s_addr = inet_addr( argv[1]);
 svrAddr.sin_port = htons (atoi(argv[2]));
 char tempBuff[2048] = {0}; 

 for ( ; ; )
 {
  // 接收数据
  struct sockaddr_in fromAddr;
  memset((char *)&fromAddr, 0, (int)sizeof(fromAddr));
  socklen_t fromLen = sizeof(fromAddr);
  ssize_t result = recvfrom( socketFd, tempBuff, sizeof(tempBuff), 0, (struct sockaddr *)&fromAddr, &fromLen);
  if ( -1 == result )
  {
   perror("recvfrom:");
   continue;
  }
  else
  {
   printf( "recv data %s successed. data len: %d/n", inet_ntoa(fromAddr.sin_addr), result );
   printf( "data:/n");
   for ( int i = 0; i < result; i++ )
   {
    printf( "%02x ", tempBuff[i] );
    if ( (i+1)%16 == 0 )
    {
     printf( "/n" );
    }
   }
   printf( "/n" );
  } 

  // 发送数据
  result = sendto( socketFd, tempBuff, result, 0, (struct sockaddr*)&fromAddr, sizeof(fromAddr));
  if ( -1 == result )
  {
   perror("sendto:");
  }
  else
  {
   printf("send data success. data len:%d/n", result );
  }
  sleep( 60 );
 }
 close(socketFd);
}

linux下udp客户端源码示例:

#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h> 

typedef struct _NSS_HEADER
{
 unsigned short   ProtocolVersion;  /* 协议版本信息 */
 unsigned short   MsgType;    /* 消息类型 */
 unsigned short   TransactionNo;   /* 传输编号 */
 unsigned short   PacketLength;   /* 数据包长度,包括Header */
}NSS_HEADER; 

int main(int argc, char **argv)
{
 printf("client ip: %s/n", argv[1]);
 printf("client port: %s/n", argv[2]);
 printf("server ip: %s/n", argv[3]);
 printf("server port: %s/n", argv[4]); 

 printf("/n service starting.../n/n");
 int  socketFd;
 struct sockaddr_in svrAddr;
 struct sockaddr_in localAddr; 

 socketFd = socket (AF_INET, SOCK_DGRAM, 0);
 if ( -1 == socketFd )
 {
  perror( "socket:" );
  exit(-1);
 } 

 // 设置地址可复用
 int option = 1;
 setsockopt( socketFd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option) );
 // 客户端IP
 memset(&localAddr, 0, sizeof(localAddr));
 localAddr.sin_family = AF_INET;
 localAddr.sin_addr.s_addr = inet_addr( argv[1]);
 localAddr.sin_port = htons (atoi(argv[2])); 

 int bindResult = bind(socketFd, (struct sockaddr *) &localAddr, sizeof(localAddr));
 if ( -1 == bindResult )
 {
  perror( "bind:" );
  sleep(10);
  close(socketFd);
  exit(-1);
 } 

 // 服务器IP
 memset(&svrAddr, 0, sizeof(svrAddr));
 svrAddr.sin_family = AF_INET;
 svrAddr.sin_addr.s_addr = inet_addr( argv[3]);
 svrAddr.sin_port = htons (atoi(argv[4]));
 char tempBuff[2048] = {0}; 

 // 每分钟发送一次数据
 NSS_HEADER hdr;
 memset( &hdr, 0, sizeof(NSS_HEADER));
 for ( ; ; )
 {
  // 发送数据
  hdr.TransactionNo++;
  ssize_t result = sendto( socketFd, &hdr, sizeof(NSS_HEADER), 0, (struct sockaddr*)&svrAddr, sizeof(svrAddr));
  if ( -1 == result )
  {
   perror("sendto:");
  }
  else
  {
   printf("send data success. data len:%d/n", result );
  } 

  // 接收数据
  struct sockaddr_in fromAddr;
  memset((char *)&fromAddr, 0, (int)sizeof(fromAddr));
  socklen_t fromLen = sizeof(fromAddr);
  result = recvfrom( socketFd, tempBuff, sizeof(tempBuff), 0, (struct sockaddr *)&fromAddr, &fromLen);
  if ( -1 == result )
  {
   perror("recvfrom:");
  }
  else
  {
   printf( "recv data %s successed. data len: %d/n", inet_ntoa(fromAddr.sin_addr), result );
   printf( "data:/n");
   for ( int i = 0; i < result; i++ )
   {
    printf( "%02x ", tempBuff[i] );
    if ( (i+1)%16 == 0 )
    {
     printf( "/n" );
    }
   }
   printf("/n");
  }
  sleep( 60 );
 }
 close(socketFd);
} 
(0)

相关推荐

  • Linux网络编程之UDP Socket程序示例

    在网络传输协议中,TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接.TCP有一种"重传确认"机制,即接收端收到数据后要发出一个肯定确认的信号,发送端如果收到接收端肯定确认的信号,就会继续发送其他的数据,如果没有,它就会重新发送. 相对而言,UDP协议则是一种无连接的,不可靠的数据报(SOCK_DGRAM)传输服务.使用UDP套接口不用建立连接,服务端在调用socket()生成一个套接字并调用bind()绑定端口后就可

  • Linux UDP socket 设置为的非阻塞模式与阻塞模式区别

    Linux UDP socket 设置为的非阻塞模式与阻塞模式区别 UDP socket 设置为的非阻塞模式 Len = recvfrom(SocketFD, szRecvBuf, sizeof(szRecvBuf), MSG_DONTWAIT, (struct sockaddr *)&SockAddr,&ScokAddrLen); UDP socket 设置为的阻塞模式 Len = recvfrom(SocketFD, szRecvBuf, sizeof(szRecvBuf), 0, (

  • Linux中使用C语言实现基于UDP协议的Socket通信示例

    linux下udp服务器端源码示例: #include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <string.h> #include <netinet/in.h> #include <stdio.h> #include <un

  • 详解Android 基于TCP和UDP协议的Socket通信

    本来想讲一下基础的网络通信方面的知识点,发现太枯燥乏味了,不过笔试中也经常会问到这方面的问题,所以关于通信方面的知识点,小编会放到面试中去,因为实战中也就面试会用到这方面知识点 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据. 而Socket通信中基于TCP/IP协议的通信则是在双方建立起连接后就可以直接进行数

  • java实现基于UDP协议网络Socket编程(C/S通信)

    一.前言:认识UDP UDP,全称User Datagram Protocol(用户数据报协议),是Internet 协议集支持一个无连接的传输协议.UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法. UDP主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向报文的简单不可靠信息传送服务.UDP 协议基本上是IP协议与上层协议的接口,适用端口分别运行在同一台设备上的多个应用程序. 二.UDP的特点(与TCP相比) 正是UDP提供不可靠服务

  • Java基于TCP协议的Socket通信

    目录 简介 TCP简介 JAVA Socket简介 SocketImpl介绍 TCP 编程 构造ServerSocket 1.1 绑定端口 1.2 设定客户连接请求队列的长度 1.3 设定绑定的IP 地址 1.4 默认构造方法的作用 多线程示例 简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户

  • Python+Socket实现基于UDP协议的局域网广播功能示例

    本文实例讲述了Python+Socket实现基于UDP协议的局域网广播功能.分享给大家供大家参考,具体如下: 服务器端: # udp_gb_server.py '''服务端(UDP协议局域网广播)''' import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) PORT = 1060 network = '<b

  • 解析C语言基于UDP协议进行Socket编程的要点

    两种协议 TCP 和 UDP 前者可以理解为有保证的连接,后者是追求快速的连接. 当然最后一点有些 太过绝对 ,但是现在不需熬考虑太多,因为初入套接字编程,一切从简. 稍微试想便能够大致理解, TCP 追求的是可靠的传输数据, UDP 追求的则是快速的传输数据. 前者有繁琐的连接过程,后者则是根本不建立可靠连接(不是绝对),只是将数据发送而不考虑是否到达. 以下例子以 *nix 平台的便准为例,因为 Windows平台需要考虑额外的加载问题,稍作添加就能在 Windows 平台上运行UDP. U

  • C语言编写基于TCP和UDP协议的Socket通信程序示例

    Tcp多线程服务器和客户端程序 服务器程序: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #define PORT 8082 #define BUFSIZE 512 cha

  • 使用C语言编写基于TCP协议的Socket通讯程序实例分享

    tcp客户端示例 #include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <string.h> #include <netinet/in.h> #include <stdio.h> #include <unistd.h>

  • java实现基于TCP协议网络socket编程(C/S通信)

    一.前言:TCP原理简介 首先,保证文章完整性,TCP的理论原理还是需要简介一下,略显枯燥๑乛◡乛๑. TCP(传输控制协议,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议.TCP旨在适应支持多网络应用的分层协议层次结构.也就是说,TCP是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议. 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务. 以上TCP的特点,也正是与UD

  • Linux中利用c语言删除某个目录下的文件

    利用c语言删除目录下文件 最近这段时间工作内容是关于Linux下的简单文件操作,以前对于Linux系统下的文件操作函数都不是太熟悉,经过这次实践,对这些函数使用有了一定的了解 如何创建文件,读写文件,这些简单的我想大家应该是比较熟悉的,我所介绍的是如何遍历某个目录,并且删除该目录下的文件(可以指定后缀名),并且也可以指定 文件的修改时间范围(多少小时以前的旧文件可以删除),下面就是简单的函数实现,仅供初学者参考(毕竟我也是初学者\(^o^)/~) #include <stdio.h> #inc

随机推荐