使用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>
#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 str_echo(int sockfd, unsigned short no)
{
  ssize_t readLen;
  ssize_t writeLen;
  char  buf[8]; 

  NSS_HEADER *hdr = (NSS_HEADER*)buf;
  memset( hdr, 0, sizeof(NSS_HEADER) );
  hdr->TransactionNo = no; 

  // 写数据
  int nWriteLen = 0;
  while ( true )
  {
    writeLen = write(sockfd, &buf[nWriteLen], sizeof(NSS_HEADER)-nWriteLen);
//    printf( "write %d/n", writeLen); 

    if (writeLen < 0 && errno == EINTR)
    {
      continue;
    }
    else if ( writeLen < 0 )
    {
      perror ( "write:" );
      return -1;
    } 

    nWriteLen += writeLen;
    // 已写完,直接返回
    if (nWriteLen >= sizeof(NSS_HEADER) )
    {
      break;
    }
  } 

  printf( "send data successed. trans no: %d/n", no ); 

  // 读数据
  int nReadLen = 8;
  while ( true )
  {
    readLen = read(sockfd, buf, nReadLen);
//    printf( "read: %d/n", readLen );
    if (readLen < 0 && errno == EINTR)
    {
      continue;
    }
    else if ( readLen <= 0 )
    {
      perror( "read:");
      return -1;
    }
    else
    {
      nReadLen -= readLen;
      if (nReadLen <= 0 )
      {
        break;
      }
    }
  } 

  printf( "read response successed./n" ); 

  return 0;
} 

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");
  while( true )
  {
    int   socketFd;
    struct sockaddr_in svrAddr;
    struct sockaddr_in localAddr; 

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

    // 设置地址可复用
    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);
      continue;
    } 

    // 服务器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])); 

    // 不断重连
    int connResult = connect(socketFd, (struct sockaddr *) &svrAddr, sizeof(svrAddr));
    if ( -1 == connResult )
    {
      perror( "connect:" );
      sleep(10);
      close(socketFd);
      continue;
    } 

    printf (" connect %s:%s successed./n", argv[3], argv[4] ); 

    static unsigned short no = 0;
    // 连接成功,每分钟发送一次数据
    for ( ; ; )
    {
      if ( -1 == str_echo(socketFd, no++) )
      {
        break;
      } 

      sleep( 60 );
    }
    close(socketFd);
  }
}

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>
#include <sys/types.h>
#include <sys/socket.h> 

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

void str_echo(int sockfd)
{
  ssize_t readLen;
  ssize_t writeLen;
  char  buf[8]; 

  while ( true )
  {
    readLen = read(sockfd, buf, 8);
    if (readLen < 0 && errno == EINTR)
    {
      continue;
    }
    else if ( readLen <= 0 )
    {
      perror( "read:");
      return ;
    }
    printf( "recv data successed. data len: %d/n", readLen ); 

    int nWriteLen = 0;
    while ( true )
    {
      writeLen == write(sockfd, &buf[nWriteLen], readLen-nWriteLen); 

      if (writeLen < 0 && errno == EINTR)
      {
        continue;
      }
      else if ( writeLen < 0 )
      {
        perror ( "write:" );
        return;
      } 

      nWriteLen += writeLen; 

      // 已写完,直接返回
      if (nWriteLen >= readLen )
      {
        break;
      }
    } 

    printf( "send data successed. data len: %d/n", readLen );
  }
} 

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

  printf( "/nservice starting ... /n/n" ); 

  int   listenfd, connfd;
  pid_t  childpid;
  socklen_t clilen;
  struct sockaddr_in cliaddr, servaddr; 

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

  // 设置地址可复用
  int option = 1;
  setsockopt( listenfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option) ); 

  memset(&servaddr, 0, sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr = inet_addr( argv[1]);
  servaddr.sin_port = htons (atoi(argv[2])); 

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

  int listenResult = listen(listenfd, 5);
  if ( -1 == listenResult )
  {
    perror( "listen:" );
    exit(-1);
  } 

  for ( ; ; )
  {
    clilen = sizeof(cliaddr);
    connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen);
    if ( -1 == connfd )
    {
      perror( "accept:" );
      continue;
    } 

    printf ("accept %s successed.fd: %d/n", inet_ntoa(cliaddr.sin_addr), connfd ); 

    if ( (childpid = fork()) == 0)
    { /* child process */
      close(listenfd);  /* close listening socket */ 

      str_echo(connfd);  /* process the request */ 

      printf ("disconnect from %d ./n", connfd );  

      exit (0);
    }
  }
  close(connfd);     /* parent closes connected socket */
} 
(0)

相关推荐

  • TCP协议详解_动力节点Java学院整理

    本文描述了TCP协议,首先简单介绍了TCP完成了一些什么功能:介绍了TCP报文格式,以及典型报文的数据格式:接着从链路控制和数据传输两个方面进行了介绍,在TCP中链路控制和数据传输是通过同一个通道进行的,并没有区分控制通道和数据通道:在网络中传输数据(控制或真实数据),网络可能发生拥堵,因此接下来简单描述了主机端进行拥塞控制所采取的方法,也简单提及了中间路由器/交换机进行拥塞避免所采取的主动措施:最后介绍了在TCP中性能分析的一些基本概念点,在开发网络应用程序的时候,需要对应用的网络需求进行一个

  • C#基于TCP协议的服务器端和客户端通信编程的基础教程

    运行在TCP之上常见的网络应用协议有比如HTTP.FTP.SMTP.POP3.IMAP. TCP是TCP/IP体系中最重要的传输协议,它提供全双工和可靠交付的服务,是大多数应用协议工作的基础. TCP是一种面向连接(连接导向)的,可靠的,基于字节流的传输层通信协议. TCP的工作过程 建立连接 传输数据 连接的终止 TCP的主要特点 1.TCP是面向连接的协议 2.是端到端的通信.每个TCP连接只能有两个端点,而且只能一对一通信,不能点对多的 的直接通信 3.高可靠性 4.全双工方式传输 5.数

  • 使用批处理重置TCP_IP协议

    在XP系统的ghost xp网络组件列表里,有一个Internet 协议,Internet 协议又称为TCP或IP,该"卸载"按钮显示是灰色--不可选状态,如果在特殊情况下我们需要重新安装TCP/IP协议可以通过下面的批处理来完成 复制代码 代码如下: @echo off echo. echo 即将重置 TCP/IP 协议.重置可能会导致网络程序工作异常. echo 只有在 TCP/IP 被破坏导致不能上网时才建议尝试本重置操作. echo. echo 任意键开始重置 TCP/IP,C

  • .Net WInform开发笔记(二)Winform程序运行结构图及TCP协议在Winform中的应用

    中午没事,把去年刚毕业那会画的几张图翻出来了,大概介绍Winform应用程序运行的过程,以及TCP协议在Winform中的应用.如果有Windows消息机制等基础,很好理解这两张图. (1)Winform应用程序运行结构图 (2)TCP通讯协议在Winform程序中的应用示意图 熟悉整个程序的来龙去脉,编程的时候就会很轻松,不会云里雾里. 另附公司招聘面试题一份,用了几次,发现效果不好,不知啥原因 1.简述接口.抽象类的区别. 2.简述重载(overload)与重写(override)的区别.

  • 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

  • Java基于Tcp协议的socket编程实例

    本文实例讲述了Java基于Tcp协议的socket编程方法,分享给大家供大家参考.具体分析如下: 以下是一对一的通信编程实现,后续会继续学习一个服务器监听多个客户端的实现. 这里用到的主要步骤如下: 第一步:以特定端口(如4800)新建socket对象 第二步:以系统输入设备构造BufferedReader对象,该对象用于接收系统键盘输入的字符 第三步:以socket对象 得到输出流来构造PrintWriter 第四步:以socket对象得到输入流来构造相应的BufferedReader对象,该

  • 使用TCP/IP协议栈指纹进行远程操作系统辨识

    概述 本文讨论了如何查询一台主机的TCP/IP协议栈来收集宝贵的信息.首先,我列举了栈指纹之外的几种"经典的"操作系统辨识方法.然后我描述了栈指纹工具的"工艺现状".接下来说明让远程主机泄漏其信息的一些技术.最后详述了我的实现(nmap),和用它获得的一些流行网站的操作系统信息.理由热点网络 我认为辨识一个系统所运行OS的用处是相当显而易见的,所以这一节会很短.最有力的例子之一是许多安全漏洞是OS相关的.试想你正在作突破试验并发现53端口是打开的.如果那是易遭攻击的

  • 使用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聊天室示例

    本文实例讲述了Java编程实现基于TCP协议的Socket聊天室.分享给大家供大家参考,具体如下: 这里使用Socket套接字进行编程,完成的是基于TCP可靠服务实现服务器与客户端的双通信. Server服务器端: package com.han; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.Win

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

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

  • 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模型中,它完成第四层传输层所指定的功能,用户

  • 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

  • java基于TCP协议实现聊天程序

    JAVA程序设计之基于TCP协议的socket聊天程序 ,供大家参考,具体内容如下 一.程序实现的功能 1.进入客户端界面 2.创建昵称 3.群发信息 4.@私聊 5.下线通知 6.在线人数统计 二.整体架构图 三.简单介绍 本程序实现了基于TCP通信的聊天程序: 1 服务器端: 服务器端继承JFrame框架,添加组件.创建服务器端的socket,起一个线程池,每接收到一个客户端的连接,分配给其一个线程处理与客户端的通信,将每个客户端的昵称和服务器分配给其的输出流存储到哈希表中.通过检索哈希表中

  • Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例

    本文实例讲述了Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能.分享给大家供大家参考,具体如下: [吐槽] 网上的代码害死人,看着都写的言之凿凿,可运行就是有问题. 有些爱好代码.喜欢收藏代码的朋友,看到别人的代码就粘贴复制过来.可是起码你也试试运行看啊大哥 [正文] 昨日修改运行了UDP协议的C/S聊天程序,可是TCP协议的怎么都不行.各种试,各种坑. 做了下面几个修改后,终于可以了: 1.对发送.接收的信息,分别进行编码和解码 2.客户端的第10行bind改为c

  • JAVA实现基于Tcp协议的简单Socket通信实例

    好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西.  1.首先先来看下基于TCP协议Socket服务端和客户端的通信模型: Socket通信步骤:(简单分为4步) 1.建立服务端ServerSocket和客户端Socket 2.打开连接到Socket的输出输入流 3.按照协议进行读写操作 4.关闭相对应的资源 2.相关联的API: 1.首先先来看下

随机推荐