• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 使用C语言编写基于TCP协议的Socket通讯程序实例分享

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

作者:hncdsun 字体:[增加 减小] 来源:互联网 时间:2017-05-28

hncdsun 通过本文主要向大家介绍了c socket tcp,c socket tcp编程,c socket tcp 客户端,c socket的tcp通讯,tcp socket等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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); 
  } 
} 
</div>

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 */ 
} 
</div>

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 浅谈socket TCP编程中connect的一些坑
  • 使用C语言编写基于TCP协议的Socket通讯程序实例分享
  • tcp socket客户端和服务端示例分享
  • vc++实现的tcp socket客户端和服务端示例

相关文章

  • 2017-05-28详解C++编程中的主表达式与后缀表达式编写基础
  • 2017-05-28c++ *运算符重载
  • 2017-05-28浅析C++标准库元组(tuple)源码
  • 2017-05-28C++卸载程序功能示例
  • 2017-05-28C 语言基础教程(我的C之旅开始了)[二]
  • 2017-05-28C++中输出十六进制形式的字符串
  • 2017-05-28vector, list, map在遍历时删除符合条件的元素实现方法
  • 2017-05-28如何在TC2.0中调用汇编程序
  • 2017-05-28基于getline()函数的深入理解
  • 2017-05-28socket多人聊天程序C语言版(一)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 贪吃蛇游戏C++命令行版实例代码
    • C语言 文件操作解析详解及实例代码
    • C++中的变长参数深入理解
    • C++之类和对象课后习题简单实例
    • 手把手教你如何优化C语言程序
    • 浅谈C语言编程中程序的一些基本的编写优化技巧
    • C++短路求值(逻辑与、逻辑或)实例
    • c++ 构造函数的初始化列表
    • 如何实现循环队列
    • C++中虚函数与纯虚函数的用法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有