当前位置: 首页 > news >正文

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

//注意要引用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;
}

转载于:https://www.cnblogs.com/MaxWoods/archive/2007/10/22/933689.html

相关文章:

  • unity中UI界面的一些动画实现总结
  • Delphi调用CreateProcess创建进程
  • untiy打android包,报Could not resolve com.android.tools.build:gradle和Connect to 127.0.0.1:80 [/127.0.0.1
  • C#访问lua获取一个全局基本数据类型
  • C#访问lua获取一个全局基本数据类型——table映射成C#中class或struct
  • Linux学习笔记12——Unix中的进程
  • C#访问lua获取一个全局基本数据类型——table映射成C#中interface
  • C#访问lua获取全局函数——映射成delegate
  • C#访问lua获取一个table中的函数——映射成interface中的函数
  • C#访问lua获取全局函数——此函数带多个返回值
  • [置顶] sqlserver2008 新建表之后无法更改表设计的原因
  • lua访问C#中类——访问成员+方法
  • C++中dynamic_cast
  • 数据结构-反转链表
  • lua中rawget和rawset
  • 【comparator, comparable】小总结
  • Electron入门介绍
  • Java IO学习笔记一
  • Java小白进阶笔记(3)-初级面向对象
  • linux学习笔记
  • Making An Indicator With Pure CSS
  • Node项目之评分系统(二)- 数据库设计
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Python 反序列化安全问题(二)
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Redis字符串类型内部编码剖析
  • VUE es6技巧写法(持续更新中~~~)
  • vuex 学习笔记 01
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 对JS继承的一点思考
  • 构造函数(constructor)与原型链(prototype)关系
  • 前端
  • 前端工程化(Gulp、Webpack)-webpack
  • 深入浅出webpack学习(1)--核心概念
  • 实现简单的正则表达式引擎
  • 我感觉这是史上最牛的防sql注入方法类
  • 异常机制详解
  • 再谈express与koa的对比
  • ionic异常记录
  • ​linux启动进程的方式
  • ​低代码平台的核心价值与优势
  • ​第20课 在Android Native开发中加入新的C++类
  • ​如何在iOS手机上查看应用日志
  • ​水经微图Web1.5.0版即将上线
  • # 计算机视觉入门
  • #stm32驱动外设模块总结w5500模块
  • (1)(1.11) SiK Radio v2(一)
  • (12)Linux 常见的三种进程状态
  • (27)4.8 习题课
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (强烈推荐)移动端音视频从零到上手(下)
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (十六)一篇文章学会Java的常用API
  • (转)Linq学习笔记