C++辅导:IPv6网络程序设计
来源:优易学  2011-9-10 17:07:03   【优易学:中国教育考试门户网】   资料下载   IT书店


  fprintf(stderr, "socket() failed with error %d: %s\n",
  WSAGetLastError(), DecodeError(WSAGetLastError()));
  WSACleanup();
  return -1;
  }
  // 绑定套接字
  if (bind(ServSock, AddrInfo->ai_addr, AddrInfo->ai_addrlen) == SOCKET_ERROR)
  {
  fprintf(stderr,"bind() failed with error %d: %s\n",
  WSAGetLastError(), DecodeError(WSAGetLastError()));
  WSACleanup();
  return -1;
  }
  // 侦听
  if (listen(ServSock, 5) == SOCKET_ERROR)
  {
  fprintf(stderr, "listen() failed with error %d: %s\n",
  WSAGetLastError(), DecodeError(WSAGetLastError()));
  WSACleanup();
  return -1;
  }
  printf("'Listening' on port %s, protocol %s, protocol family %s\n",
  Port, \"TCP\",
  "PF_INET6");
  freeaddrinfo(AddrInfo);
  //使用select I/O 模型进行收发
  FD_ZERO(&SockSet);
  while(1)
  {
  FromLen = sizeof(From);
  if (FD_ISSET(ServSock, &SockSet)) break;
  FD_SET(ServSock, &SockSet);
  if (select(0, &SockSet, 0, 0, 0) == SOCKET_ERROR)
  {
  fprintf(stderr, "select() failed with error %d: %s\n",
  WSAGetLastError(), DecodeError(WSAGetLastError()));
  WSACleanup();
  return -1;
  }
  }
  if (FD_ISSET(ServSock, &SockSet))
  {
  FD_CLR(ServSock, &SockSet);
  }

 //接受一个连接
  SOCKET ConnSock;
  ConnSock = accept(ServSock, (LPSOCKADDR)&From, &FromLen);
  if (ConnSock == INVALID_SOCKET)
  {
  fprintf(stderr, "accept() failed with error %d: %s\n",
  WSAGetLastError(), DecodeError(WSAGetLastError()));
  WSACleanup();
  return -1;
  }
  if (getnameinfo((LPSOCKADDR)&From, FromLen, Hostname,
  sizeof(Hostname), NULL, 0, NI_NUMERICHOST) != 0)
  strcpy(Hostname, "<unknown>");
  printf("\nAccepted connection from %s\n", Hostname);
  while(1)
  {
  //等待接受数据
  AmountRead = recv(ConnSock, Buffer, sizeof(Buffer), 0);
  if (AmountRead == SOCKET_ERROR)
  {
  fprintf(stderr, "recv() failed with error %d: %s\n", WSAGetLastError(), DecodeError(WSAGetLastError()));
  closesocket(ConnSock);
  break;
  }
  if (AmountRead == 0) {
  printf("Client closed connection\n");
  closesocket(ConnSock);
  break;
  }
  printf("Received %d bytes from client: [%.*s]\n",
  AmountRead, AmountRead, Buffer);
  //进行简单ECHO 回应
  printf("Echoing same data back to client\n");
  RetVal = send(ConnSock, Buffer, AmountRead, 0);
  if (RetVal == SOCKET_ERROR)
  {
  fprintf(stderr, "send() failed: error %d: %s\n",
  WSAGetLastError(), DecodeError(WSAGetLastError()));
  closesocket(ConnSock);
  break;
  }
  }
  return 0;
  }
  void CIPv6::Usage(char *ProgName)
  {
  fprintf(stderr, "\nSimple socket sample server program.\n");
  fprintf(stderr, "transport tEither TCP or UDP. (default: %s)\n",
  "TCP");
  fprintf(stderr, "port\t\tPort on which to bind. (default %s)\n",
  DEFAULT_PORT);
  fprintf(stderr, "address\tIP address on which to bind.(default: unspecified address)\n");
  WSACleanup();
  exit(1);
  }
  LPSTR CIPv6::DecodeError(int ErrorCode)
  {
  static char Message[1024];
  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS |
  FORMAT_MESSAGE_MAX_WIDTH_MASK, NULL, ErrorCode,
  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  (LPSTR)Message, 1024, NULL);
  return Message;
  }2.应用示例
  #include "stdafx.h"
  #include "IPv6.h"
  int main(int argc, char* argv[])
  {
  CIPv6 m_ipv6;
  m_ipv6.CreateServer(); //采用默认创建服务器,
  //如果你成功安装了IPv6可以使用正常使用return 0;
  }

上一页  [1] [2] [3] 

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训