windows API(TCP/IP)通讯编程

server端程序:


  1. #include <winsock2.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <windows.h>
  5. #include <process.h>
  6. #pragma comment(lib,"Ws2_32")
  7. #define DEFAULT_PORT 5150
  8. #define DEFAULT_BUFFER 4096
  9. int iPort = DEFAULT_PORT;
  10. BOOL bInterface = FALSE,
  11. bRecvOnly = FALSE;
  12. char szAddress[128];
  13. void usage()
  14. {
  15.  printf("usage:server[-p:x] [-i:IP] [-o]/n/n");
  16.  printf("       -p:x   Port number to listen on/n");
  17.  printf("       -i:str Interface to listen on/n");
  18.  printf("       -o     Don't echo the data back/n/n");
  19.  ExitProcess(1);
  20. }
  21. void ValidateArgs(int argc,char **argv)
  22. {
  23.  int i;
  24.  for(i=1;i<argc;i++)
  25.  {
  26.   if((argv[i][0] == '-')||(argv[i][0] == '/'))
  27.   {
  28.    switch(tolower(argv[i][1]))
  29.    {
  30.    case 'p':
  31.     iPort = atoi(&argv[i][3]);
  32.     break;
  33.    case 'i':
  34.     bInterface = TRUE;
  35.     if(strlen(argv[i])>3)
  36.      strcpy(szAddress,&argv[i][3]);
  37.     break;
  38.    case 'o':
  39.     bRecvOnly = TRUE;
  40.     break;
  41.    default:
  42.     usage();
  43.     break;
  44.    }
  45.   }
  46.  }
  47. }
  48. DWORD WINAPI ClientThread(LPVOID lpParam)
  49. {
  50.  SOCKET sock = (SOCKET) lpParam;
  51.  char   szBuff[DEFAULT_BUFFER];
  52.  int ret,nLeft,idx;
  53.  while(1)
  54.  {
  55.   ret = recv(sock,szBuff,DEFAULT_BUFFER,0);
  56.   if(ret == 0)
  57.    break;
  58.   else if(ret == SOCKET_ERROR)
  59.   {
  60.    printf("recv() failed:%d/n",WSAGetLastError());
  61.    break;
  62.   }
  63.   szBuff[ret]='/0';
  64.   printf("recv:'%s'/n",szBuff);
  65.   if(!bRecvOnly)
  66.   {
  67.    nLeft = ret;
  68.    idx = 0;
  69.    while(nLeft>0)
  70.    {
  71.     ret = send(sock,&szBuff[idx],nLeft,0);
  72.     if(ret == 0)
  73.      break;
  74.     else if (ret == SOCKET_ERROR)
  75.     {
  76.      printf("send() failed:%d/n",WSAGetLastError());
  77.      break;
  78.     }
  79.     nLeft -=ret;
  80.     idx+=ret;
  81.    }
  82.   }
  83.  }
  84.  return 0;
  85. }
  86. int main(int argc,char **argv)
  87. {
  88.  WSADATA wsd;
  89.  SOCKET sListen,sClient;
  90.  int iAddrSize;
  91.  HANDLE hThread;
  92.  DWORD dwThreadId;
  93.  struct sockaddr_in local,client;
  94.  ValidateArgs(argc,argv);
  95.  if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
  96.  {
  97.   printf("failed to load winsock!/n");
  98.   return 1;
  99.  }
  100.  sListen = socket(AF_INET, SOCK_STREAM,IPPROTO_IP);
  101.  if(sListen == SOCKET_ERROR)
  102.  {
  103.   printf("socket() failed:%d/n",WSAGetLastError());
  104.   return 1;
  105.  }
  106.  else
  107.   printf("socket() successful!/n");
  108.  if(bInterface)
  109.  {
  110.   local.sin_addr.s_addr = inet_addr(szAddress);
  111.   if(local.sin_addr.s_addr==INADDR_NONE)
  112.    usage();
  113.  }
  114.  else
  115.   local.sin_addr.s_addr = htonl(INADDR_ANY);
  116.  local.sin_family= AF_INET;
  117.  local.sin_port = htons(iPort);
  118.  if(bind(sListen,(struct sockaddr *) &local,sizeof(local)) == SOCKET_ERROR)
  119.  {
  120.   printf("bind() failed:%d/n",WSAGetLastError());
  121.   return 1;
  122.  }
  123.  else
  124.   printf("bind() successful!/n");
  125.  int listenState = listen(sListen, 8);
  126.  printf("%d/n",listenState);
  127.  while(1)
  128.  {
  129.   iAddrSize = sizeof(client);
  130.   sClient = accept(sListen,(struct sockaddr *) &client,&iAddrSize);
  131.   if(sClient ==INVALID_SOCKET)
  132.   {
  133.    printf("accept() failed:%d/n",WSAGetLastError());
  134.    break;
  135.   }
  136.   printf("Accept client:%s:%d/n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
  137.   hThread = ::CreateThread(NULL,0,ClientThread,(LPVOID)sClient,0,&dwThreadId);
  138.   if(hThread == NULL)
  139.   {
  140.    printf("creatThread() failed:%d/n",GetLastError());
  141.    break;
  142.   }
  143.   CloseHandle(hThread);
  144.  }
  145.  closesocket(sListen);
  146.  WSACleanup();
  147.  return 0;
  148. }

client端程序:

  1. #include <winsock2.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #pragma comment(lib,"Ws2_32")
  5. #define DEFAULT_COUNT 20
  6. #define DEFAULT_PORT 5150
  7. #define DEFAULT_BUFFER 2048
  8. #define DEFAULT_MESSAGE "This is a test of the emergency broadcasting system"
  9.  
  10. char szServer[128],szMessage[1024];
  11. int iPort = DEFAULT_PORT;
  12. DWORD  dwCount = DEFAULT_COUNT;
  13. BOOL bSendOnly = FALSE;
  14. void usage()
  15. {
  16.  printf("usage:client  [-p:x] [-i:IP] [-o]/n/n");
  17.  printf("       -p:x   Remote port to send to/n");
  18.  printf("       -s:IP  server's IP address or host name/n");
  19.  printf("       -n:x   number of times to send message/n");
  20.  printf("       -o     send message only; don't receive/n");
  21.  ExitProcess(1);
  22. }
  23. void ValidateArgs(int argc,char **argv)
  24. {
  25.  int i;
  26.  for(i=1;i<argc;i++)
  27.  {
  28.   if((argv[i][0] == '-')||(argv[i][0] == '/'))
  29.   {
  30.    switch(tolower(argv[i][1]))
  31.    {
  32.    case 'p':
  33.     if (strlen(argv[i])>3)
  34.      iPort = atoi(&argv[i][3]);
  35.     break;
  36.    case 's':
  37.     if(strlen(argv[i])>3)
  38.      strcpy(szServer,&argv[i][3]);
  39.     break;
  40.    case 'n':
  41.     if(strlen(argv[i])>3)
  42.      dwCount = atol(&argv[1][3]);
  43.     break;
  44.    case 'o':
  45.     bSendOnly = TRUE;
  46.     break;
  47.    default:
  48.     usage();
  49.     break;
  50.    }
  51.   }
  52.  }
  53. }
  54. int main(int argc, char **argv)
  55. {
  56.  WSADATA wsd;
  57.  SOCKET sClient;
  58.  char szBuffer[DEFAULT_BUFFER];
  59.  int ret,i;
  60.  struct sockaddr_in server;
  61.  struct hostent *host = NULL;
  62.  ValidateArgs(argc,argv);
  63.  if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
  64.  {
  65.   printf("failed to load winsock library!/n");
  66.   return 1;
  67.  }
  68.  strcpy(szMessage,DEFAULT_MESSAGE);
  69.  sClient= socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  70.  if(sClient == INVALID_SOCKET)
  71.  {
  72.   printf("socket() fialed: %d/n", WSAGetLastError());
  73.   return 1;
  74.  }
  75.  server.sin_family = AF_INET;
  76.  server.sin_port = htons(iPort);
  77.  server.sin_addr.s_addr = inet_addr("192.168.0.105");
  78.  if(server.sin_addr.s_addr == INADDR_NONE)
  79.  {
  80.   host = gethostbyname(szServer);
  81.   if( host == NULL)
  82.   {
  83.    printf("Unable to resolve server:%s/n",szServer);
  84.    return 1;
  85.   }
  86.   CopyMemory(&server.sin_addr,host->h_addr_list[0],host->h_length );
  87.  }
  88.  int m = connect(sClient,(struct sockaddr *)&server,sizeof(server));
  89.  if(m==SOCKET_ERROR)
  90.  {
  91.   int errorCode = WSAGetLastError();
  92.   printf("connect() fialed:%d/n",errorCode);
  93.   return 1;
  94.  }
  95.  for(i =0;i < dwCount; i++)
  96.  {
  97.   ret = send(sClient,szMessage,strlen(szMessage),0);
  98.   if(ret ==0)
  99.    break;
  100.   else if (ret==SOCKET_ERROR)
  101.   {
  102.    printf("send() fialed:%d/n",WSAGetLastError());
  103.    break;
  104.   }
  105.    printf("send %d bytes/n",ret);
  106.    if(!bSendOnly)
  107.    {
  108.     ret = recv(sClient,szBuffer,DEFAULT_BUFFER,0);
  109.     if(ret ==0)
  110.      break;
  111.     else if (ret == SOCKET_ERROR)
  112.     {
  113.      printf("recv() fialed:%d/n",WSAGetLastError());
  114.      break;
  115.     }
  116.     szBuffer[ret] = '/0';
  117.     printf("recv[%d bytes]:'%S'=n",ret,szBuffer);
  118.    }
  119.   }
  120.   closesocket(sClient);
  121.   WSACleanup();
  122.   return 0 ; 
  123.  }
  124.  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值