现在的位置: 首页 > 综合 > 正文

C++网络编程–简单的WinSock代码

2011年12月23日 ⁄ 综合 ⁄ 共 1463字 ⁄ 字号 评论关闭

//注意要引用WinSock2的lib文件,否则编译不会通过
#include <WINSOCK2.H>
#include <stdio.h>

int main(int argc,char** argv)
{
 WSADATA wsaData;
 char HostName[256];
 hostent* HostEnt;
 protoent* ProtoEnt;
 in_addr** Addr;
 char* IPAddr;
 SOCKET Socket;
 sockaddr_in Sin;
 SOCKET AcceptSocket;
 
 //初始化WinSock
 if(WSAStartup(MAKEWORD(2,2),&wsaData))
 {
  printf("Init WinSock failed!\n");
  return 1;
 }

 //获取主机名
 gethostname(HostName,256);
 printf("%s\n",HostName);

 //获取主机信息
 HostEnt=gethostbyname(HostName);
 printf("%s\n",HostEnt->h_name);
 
 //枚举主机IP地址列表
 Addr=(in_addr**)HostEnt->h_addr_list;
 while(*Addr)
 {
  IPAddr=inet_ntoa(**Addr);
  printf("%s\n",IPAddr);
  Addr++;
 }

 
 //建立Socket
 
 ProtoEnt=getprotobyname("TCP");
 
 Socket=socket(AF_INET,SOCK_STREAM,ProtoEnt->p_proto);

 if(Socket<0)
 {  
  printf("Socket error!");
  return 2;
 }

 
 //绑定Socket
 Sin.sin_port=htons(23);
 Sin.sin_family=AF_INET;
 Sin.sin_addr.s_addr=0;

 if(bind(Socket,(sockaddr*)&Sin,sizeof(Sin)))
 {
  printf("%s\n","Socket error!");
  return 3;
 }

 //侦听请求
 if(listen(Socket,1))
 {
  printf("%s","Socket error!");
  return 4;
 }
 
 //
 while (1)
 {
  AcceptSocket=SOCKET_ERROR;
  while(AcceptSocket==SOCKET_ERROR)
  {
   AcceptSocket=accept(Socket,(sockaddr*)&Sin,NULL);
     }
  printf( "Client Connected.\n");
  break;
 }

 char msg[]="\r\n==Connected!==\r\n";

 printf("%d\n",send(AcceptSocket,msg,strlen(msg),0));

 //关闭Socket收发功能
 shutdown(AcceptSocket,0);

 closesocket(AcceptSocket);
 closesocket(Socket);

 //取消被阻塞的Socket
 if(WSAIsBlocking()) WSACancelBlockingCall();
 
 //释放WinSock资源
 WSACleanup();
 
 return 0;
}

抱歉!评论已关闭.