服务器端代码server.cpp:

 #include <stdio.h>
 #include <WinSock2.h>
 #pragma comment(lib,"ws2_32.lib")        //加载ws2_32.dll

 int main()
 {
     //初始化DLL
     /************************************************************************/
     /*调用WSAStartup()函数进行初始化,并指明要使用的版本号                     */
     /************************************************************************/
     WSADATA wsaData;
     WSAStartup(MAKEWORD(,),&wsaData);            //主版本号为2,副版本号为2,返回0x0202

     //创建套接字
     /************************************************************************/
     /*Windows下使用的socket()函数来创建套接字,原型为:
     SOCKET socket(int af,int type,int protocol);
     1)af为地址族(Address Family),也就是IP地址类型,常用的有AF_INET(表示IPv4地址)和AF_INET6(表示IPv6地址)。
     AF是“Address Family”的简写,INET是“Internet”的简写。
     也可以使用PF前缀,PF是“Protocol Family”的简写,它和AF是一样的。PF_INET等价于AF_INET,PF_INET6等价于AF_INET6
     2)type为数据传输方式,常用的有SOCK_STREAM(面向连接的数据传输方式)和SOCK_DGRAM(无连接的数据传输方式)
     3)protocol表示传输协议,常用的有IPPROTO_TCP和IPPTOTO_UDP,分别表示TCP传输协议和UDP传输协议
     */
     /************************************************************************/
     SOCKET servSock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);            //创建TCP套接字,返回SOCKET类型的句柄

     //绑定套接字
     /************************************************************************/
     /*bind()函数的原型为:
     int bind(SOCKET sock,const struct sockaddr *addr,int addrlen);        //Windows
     1)sock为socket文件句柄,addr为sockaddr结构体变量的指针,addrlen为addr变量的大小,可由sizeof()计算得出
     2)这里使用sockaddr_in结构体,然后再强制转换为SOCKADDR类型。可以认为,SOCKADDR是一种通用的结构体,可以用来
     保存多种类型的IP地址和端口号,而sockaddr_in是专门用来保存IPv4地址的结构体。
     */
     /************************************************************************/
     sockaddr_in sockAddr;
     memset(&sockAddr,,sizeof(sockAddr));                        //每个字节都用0填充
     sockAddr.sin_family=PF_INET;                                //使用IPv4地址
     sockAddr.sin_addr.s_addr=inet_addr("127.0.0.1");        //具体的IP地址(s_addr是一个整数,
     //而IP地址是一个字符串,所以需要inet_addr()函数进行转换)
     sockAddr.sin_port=htons();        //端口
     //(理论上端口号的取值范围为0-65536,但0-1023的端口一般由系统分配给特定的服务程序,
     //例如Wed服务的端口号为80,FTP服务的端口号为21,所以我们的程序要尽量在1024-65536之间分配端口号
     //端口号需要用htons()函数转换)
     bind(servSock,(SOCKADDR*)&sockAddr,sizeof(SOCKADDR));        //将套接字和IP、端口绑定    

     //进入监听状态
     /************************************************************************/
     /*对于服务端程序,使用bind()绑定套接字后,还需要使用listen()函数让套接字进入被动监听
     状态,再调用accept()函数,就可以随时响应客户端的请求了
     通过listen()函数可以让套接字进入被动监听状态,它的原型为:
     int listen(SOCKET sock,int backlog);        //Windows
     sock为需要进入监听状态的套接字,backlog为请求队列的最大长度
     */
     /************************************************************************/
     listen(servSock,);

     //接收客户端请求
     /************************************************************************/
     /*当套接字处于监听状态时,可以通过accept()函数来接收客户端请求,它的原型为:
     SOCKET accept(SOCKET sock,struct sockaddr *addr,int *addrlen);        //Windows
     sock为服务端套接字,addr为sockaddr结构体变量,addrlen为参数addr的长度,可由sizeof()求得。
     accept()返回一个新的套接字来和客户端通信,addr保存了客户端的IP地址和端口号,而sock是服务器端的套接字。
     后面和客户端通信时,要使用这个新生成的套接字,而不是原来服务器端的套接字。

     listen()只是让套接字进入监听状态,并没有真正接收客户端请求,listen()后面的代码会继续执行,直到
     遇到accept()。accept()会阻塞程序执行(后面代码不能被执行),直到有新的请求到来。
     */
     /************************************************************************/
     SOCKADDR clntAddr;
     int nSize=sizeof(SOCKADDR);
     SOCKET clntSock=accept(servSock,(SOCKADDR*)&clntAddr,&nSize);

     //向客户端发送数据
     /************************************************************************/
     /*从服务器端发送数据使用send()函数,它的原型为:
     int send(SOCKET sock,const char *buf,int len,int flags);
     sock为要发送数据的套接字,buf为要发送的数据的缓冲区地址,len为要发送的数据的字节数,flags为要
     发送数据时的选项。
     最后的flags参数一般设置为0或NULL。
     */
     /************************************************************************/
     char *str="Hello World!";
     send(clntSock,str,strlen(str)+sizeof(char),NULL);

     //关闭套接字
     closesocket(clntSock);
     closesocket(servSock);

     //终止DLL的使用
     WSACleanup();

     ;
 }

客户端代码client.cpp:

 #include <stdio.h>
 #include <stdlib.h>
 #include <WinSock2.h>
 #pragma  comment(lib,"ws2_32.lib")            //加载ws2_32.dll

 int main()
 {
     //初始化DLL
     WSADATA wsaData;
     WSAStartup(MAKEWORD(,),&wsaData);

     //创建套接字
     SOCKET sock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);

     //向服务器发起请求
     sockaddr_in sockAddr;
     memset(&sockAddr,,sizeof(sockAddr));        //每个字节都用0填充
     sockAddr.sin_family=PF_INET;
     sockAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
     sockAddr.sin_port=htons();

     /************************************************************************/
     /*connect()函数用来建立连接,它的原型为:
     int connect(SOCKET sock,const struct sockaddr *serv_addr,int addrlen);        //Windows
     */
     /************************************************************************/
     connect(sock,(SOCKADDR*)&sockAddr,sizeof(SOCKADDR));

     //接收服务器传回的数据
     };

     /************************************************************************/
     /*在客户端接收数据使用recv()函数,它的原型为:
     int recv(SOCKET sock,char *buf,int len,int flags);
     */
     /************************************************************************/
     recv(sock,szBuffer,MAXBYTE,NULL);

     //输出接收到的数据
     printf("Message from server: %s\n",szBuffer);

     //关闭套接字
     closesocket(sock);

     //终止使用DLL
     WSACleanup();

     system("pause");

     ;
 }

一个简单的Windows下的socket程序的更多相关文章

  1. gcc和MinGW的异同(在cygwin/gcc做的东西可以无缝的用在linux下,没有任何问题,是在windows下开发linux程序的一个很好的选择)

    cygwin/gcc和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器. cygwin/gcc完全可以和在linux下的gcc化做等号,这个可以从 ...

  2. windows下的socket网络编程

    windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了, ...

  3. windows下的socket网络编程(入门级)

    windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了,这次因为需要做一个跨平台的网络程序,就先 ...

  4. winsock教程- windows下的socket编程(c语言实现)

    winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程     这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下 ...

  5. 使用Code::blocks在windows下写网络程序

    使用Code::blocks在windows下写网络程序 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创 ...

  6. # 如何在Windows下运行Linux程序

    如何在Windows下运行Linux程序 一.搭建 Linux 环境 1.1 安装 VMware Workstation https://www.aliyundrive.com/s/TvuMyFdTs ...

  7. Windows下,通过程序设置全屏抗锯齿(多重采样)的方法

    这里说的全屏抗锯齿,不是基于着色器的FXAA之类的方式,而是兼容性更好的,基于固定管线的多重采样方式. 先来说一下开发环境,我用的是VC2013+GLEW1.11. 要通过程序设置多重采样,首先需要进 ...

  8. java最简单的知识之创建一个简单的windows窗口,利用Frame类

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 微博:http://weibo.com/mcxiaobing 首先给大家看一下 ...

  9. [MapReduce_add_1] Windows 下开发 MapReduce 程序部署到集群

    0. 说明  Windows 下开发 MapReduce 程序部署到集群 1. 前提 在本地开发的时候保证 resource 中包含以下配置文件,从集群的配置文件中拷贝 在 resource 中新建  ...

随机推荐

  1. 关于GC的几篇文章

    http://msdn.microsoft.com/zh-cn/magazine/bb985010(en-us).aspx http://msdn.microsoft.com/zh-cn/magazi ...

  2. PPTP-VPN第一章——部署与简单使用

    最近前游戏同事搞了台的VPS,贡献出来做VPN使用.目前流行的服务器VPN软件主要有PPTP VPN和Openvpn.Openvpn虽然功能较为强大,且安全性高,支持nat穿越等等,但服务器端和客户端 ...

  3. js学习随笔

    prompt 提示; parse解析;slice划分,切片;sort排序: 移除样式,removeAttribute("style") document.getElementByI ...

  4. PTA Iterative Mergesort

    How would you implement mergesort without using recursion? The idea of iterative mergesort is to sta ...

  5. 第三方登录 QQ 错误码100044(提示 该应用非官方正版应用)

    当你碰到这个问题的时候,不要着急,你的功能已经走通了,代码没有问题. 100044 原因: 1.首先确定你的包名和签名,跟申请第三方平台的是一个.(真心吐槽一下,接盘侠不好当,尤其是没有交接的) 2. ...

  6. Python全栈之路目录结构

    基础 1.Python全栈之路-----基础篇 2.Python全栈之路---运算符与基本的数据结构 3.Python全栈之路3--set集合--三元运算--深浅拷贝--初识函数 4.Python全栈 ...

  7. 10款免费而优秀的图表JS插件

    http://www.open-open.com/lib/view/open1406378625726.html http://www.ichartjs.com http://echarts.baid ...

  8. jQuery Ajax传递数组到asp.net web api参数为空

    前端: var files = []; files.push({ FileName: "1.jgp", Extension: ".jgp", FileType: ...

  9. webpack 的简单使用

    p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Helvetica Neue"; color: #323333 } p. ...

  10. ng-repeat && ng-options的故事

    ng-repeat && ng-options的故事   1. <select class="input-small" ng-model="newH ...