加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:33:00 所属栏目:百科 来源:网络整理
导读: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

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,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,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,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,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,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,0); 
  if ( -1 == listenfd ) 
  { 
    perror( "socket:" ); 
    exit(-1); 
  } 
 
  // 设置地址可复用 
  int option = 1; 
  setsockopt( listenfd,sizeof(option) ); 
 
  memset(&servaddr,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 */ 
} 

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读