服务器端代码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. DirectX12 Samples 学习笔记 – PredicationQueries

    一.效果 这是一个比较简单的sample,运行sample可以看到,当红橙色长方形完全覆盖白色正方形时,白色正方形不显示,其他情况,均显示白色正方形. 二.实现 Render主要由三个部分组成 1.F ...

  3. b/s结构的物业管理系统(一)-------登录篇

    最近计划做一个非框架的物业管理系统前端使用bootstrap js jquery 等希望各位指点一下共同学习 ---前端登录页面------ 这个页面的输入框组用的bootstrap的,我设置了几张背 ...

  4. scala 学习之: list.fill 用法

    题目描述: Decode a run-length encoded list. Given a run-length code list generated as specified in probl ...

  5. JSP开发模式2_JSP/Servlet/JavaBean(简单注册功能)

    import java.util.regex.Matcher;import java.util.regex.Pattern; public class RegisterBean {    privat ...

  6. @ViewDebug.ExportedProperty的使用

    原文链接:http://daemon369.github.io/android/2014/06/12/android-viewdebug-exportedproperty/ http://www.eo ...

  7. 【BZOJ1208】宠物收养所(平衡树,splay)

    题意:见题面 思路:因为每个时刻要么全是人要么全是宠物,所以可以一棵splay解决 维护单点插入,单点删除,求前驱,求后继即可 ..,..]of longint; num,fa:..]of longi ...

  8. php学习笔记-基础篇

    1."var_dump"函数可以将变量的数据类型显示出来. 2."memory_get_usage"获取当前PHP消耗的内存. 3.php中的字符串型分单引号, ...

  9. 应用程序缓存--manifest

    应用程序缓存(Application Cache)为应用带来三个优势: 离线浏览 - 用户可在应用离线时使用它们 速度 - 已缓存资源加载得更快 减少服务器负载 - 浏览器将只从服务器下载更新过或更改 ...

  10. WinForm richtextbox 关键字变红色

    private void HilightRichText(RichTextBox control, string hilightString)        {            int nSel ...