程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 應用C說話編寫基於TCP協定的Socket通信法式實例分享

應用C說話編寫基於TCP協定的Socket通信法式實例分享

編輯:關於C++

應用C說話編寫基於TCP協定的Socket通信法式實例分享。本站提示廣大學習愛好者:(應用C說話編寫基於TCP協定的Socket通信法式實例分享)文章只能為提供參考,不一定能成為您想要的結果。以下是應用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 */ 
} 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved