最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用C語言編寫基于TCP協(xié)議的Socket通訊程序?qū)嵗窒?/h1>
 更新時(shí)間:2016年03月22日 17:48:39   作者:hncdsun  
這篇文章主要介紹了使用C語言編寫基于TCP協(xié)議的Socket通訊程序?qū)嵗窒?能夠?qū)崿F(xiàn)包括重新連接與每分鐘通信一次等的功能,需要的朋友可以參考下

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;    /* 協(xié)議版本信息 */ 
  unsigned short     MsgType;        /* 消息類型 */ 
  unsigned short     TransactionNo;     /* 傳輸編號(hào) */ 
  unsigned short     PacketLength;      /* 數(shù)據(jù)包長(zhǎng)度,包括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; 
 
  // 寫數(shù)據(jù) 
  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 ); 
 
  // 讀數(shù)據(jù) 
  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; 
    } 
 
    // 設(shè)置地址可復(fù)用 
    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; 
    } 
 
    // 服務(wù)器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; 
    // 連接成功,每分鐘發(fā)送一次數(shù)據(jù) 
    for ( ; ; ) 
    { 
      if ( -1 == str_echo(socketFd, no++) ) 
      { 
        break; 
      } 
       
      sleep( 60 ); 
    } 
    close(socketFd); 
  } 
} 

tcp服務(wù)器源碼示例

#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;    /* 協(xié)議版本信息 */ 
  unsigned short     MsgType;        /* 消息類型 */ 
  unsigned short     TransactionNo;     /* 傳輸編號(hào) */ 
  unsigned short     PacketLength;      /* 數(shù)據(jù)包長(zhǎng)度,包括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); 
  } 
 
  // 設(shè)置地址可復(fù)用 
  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 */ 
} 

相關(guān)文章

  • C語言中帶頭雙向循環(huán)鏈表基本操作的實(shí)現(xiàn)詳解

    C語言中帶頭雙向循環(huán)鏈表基本操作的實(shí)現(xiàn)詳解

    無頭單向非循環(huán)鏈表結(jié)構(gòu)簡(jiǎn)單,一般不會(huì)單獨(dú)用來存數(shù)據(jù)。而帶頭雙向循環(huán)鏈表的結(jié)構(gòu)較為復(fù)雜,一般用在單獨(dú)存儲(chǔ)數(shù)據(jù)。本文將介紹帶頭雙向循環(huán)鏈表的基本操作,需要的可以參考一下
    2022-11-11
  • C?語言中布爾值的用法實(shí)戰(zhàn)案例

    C?語言中布爾值的用法實(shí)戰(zhàn)案例

    這篇文章主要為大家介紹了C語言中布爾值的用法實(shí)戰(zhàn)案例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • snprintf函數(shù)的用法解析

    snprintf函數(shù)的用法解析

    以下是對(duì)snprintf函數(shù)的具體使用方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-07-07
  • Clion(CMake工具)中引入第三方庫的詳細(xì)方法

    Clion(CMake工具)中引入第三方庫的詳細(xì)方法

    這篇文章主要介紹了Clion(CMake工具)中引入第三方庫的詳細(xì)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • 實(shí)例詳解C++中指針與引用的區(qū)別

    實(shí)例詳解C++中指針與引用的區(qū)別

    引用是C++引入的重要機(jī)制(C語言沒有引用),它使原來在C中必須用指針來實(shí)現(xiàn)的功能有了另一種實(shí)現(xiàn)的選擇,在書寫形式上更為簡(jiǎn)潔,那么引用的本質(zhì)是什么,它與指針又有什么關(guān)系呢?這篇文章主要給大家介紹了關(guān)于C++中指針與引用的區(qū)別,需要的朋友可以參考下
    2021-07-07
  • 如何用C語言生成簡(jiǎn)單格式的xml

    如何用C語言生成簡(jiǎn)單格式的xml

    本篇文章是對(duì)使用C語言生成簡(jiǎn)單格式的xml的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Windows下sentry接入C/C++程序的詳細(xì)過程

    Windows下sentry接入C/C++程序的詳細(xì)過程

    sentry作為一個(gè)開源的軟件,發(fā)展至今,已經(jīng)非常成熟。它支持的平臺(tái)眾多,甚至于針對(duì)不同的工作者(后臺(tái)、前端、客戶端)都有相應(yīng)的內(nèi)容,這篇文章主要介紹了Windows下sentry接入C/C++程序,需要的朋友可以參考下
    2022-09-09
  • C語言實(shí)現(xiàn)簡(jiǎn)單學(xué)生信息管理系統(tǒng)

    C語言實(shí)現(xiàn)簡(jiǎn)單學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡(jiǎn)單學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Qt音視頻開發(fā)之利用ffmpeg實(shí)現(xiàn)解碼本地?cái)z像頭

    Qt音視頻開發(fā)之利用ffmpeg實(shí)現(xiàn)解碼本地?cái)z像頭

    一開始用ffmpeg做的是視頻流的解析,后面增加了本地視頻文件的支持,到后面發(fā)現(xiàn)ffmpeg也是支持本地?cái)z像頭設(shè)備的,所以本文就來用ffmpeg實(shí)現(xiàn)解碼本地?cái)z像頭功能吧
    2023-03-03
  • C/C++中的typedef和#define詳解

    C/C++中的typedef和#define詳解

    這篇文章主要介紹了C/C++中的typedef和#define詳解的相關(guān)資料,需要的朋友可以參考下
    2017-02-02

最新評(píng)論

石泉县| 沂南县| 嵊州市| 黄浦区| 丹凤县| 蒲江县| 仙桃市| 伊春市| 镇安县| 保康县| 建宁县| 五家渠市| 西城区| 呼图壁县| 巨鹿县| 大新县| 河间市| 武宁县| 正蓝旗| 韶关市| 龙江县| 比如县| 登封市| 高碑店市| 曲靖市| 家居| 柳河县| 三明市| 理塘县| 永德县| 额敏县| 宜宾市| 慈溪市| 周宁县| 娄底市| 游戏| 上虞市| 南平市| 舟山市| 马鞍山市| 小金县|