学习孙鑫老师的vc++深入浅出,有一段时间了,第一次接触socket说实话有点儿看不懂,第一次基本上是看他说一句我写一句完成的,第二次在看SOCKET多少有点儿感觉了,接下来我把利用SOCKET完成TCP和UDP两种通讯模式的流程和代码分享一下,希望对大家多少能有点儿帮助,有什么说的不对的欢迎各位大神指正。

TCP

TCP是点对点的通讯模式,数据传输质量高,对于传输数据完整性要求高的情况一般用TCP,具体到vc++中,一般选用的是服务器/客户端模式,socket实现TCP通讯在服务器端一般分为以下几步:

服务器端

1.加载套接字库,加载套接字库的代码一般是固定的每次复制以下就OK。

WORD wVersionRequested;
      WSADATA wsaData;
      int err;
      wVersionRequested=MAKEWORD(1,1);
      err=WSAStartup(wVersionRequested,&wsaData);
      if(err!=0)
    {
    return;
    }
      if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)
   {

WSACleanup();
     return;
   }

2.创建套接字

SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
    SOCKADDR_IN sockaddr;//创建一个地址结构体,对它的变量进行设置
    sockaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    sockaddr.sin_family=AF_INET;
    sockaddr.sin_port=htons(6000);

3.将套接字和IP地址和端口连接

bind(sockSrv,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));//绑定

4.将套接字设置为监听模式

listen(sockSrv,5);//设置为监听模式

5.创建链接套接字

SOCKADDR_IN sockclient;
    int len=sizeof(SOCKADDR);
    SOCKET sockCon=accept(sockSrv,(SOCKADDR*)&sockclient,&len);//创建链接套接字

6.发送和接收数据给客户端

char sendBuf[100];

send(sockCon,sendBuf,strlen(sendBuf)+1,0);
    char recvBuf[100];
    recv(sockCon,recvBuf,100,0);//发送\接收函数

7.关闭套接字

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

客户端

1.加载套接字库

与服务器端代码一样,直接复制就可以

2.创建套接字

SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
    SOCKADDR_IN sockaddr;
    sockaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    sockaddr.sin_family=AF_INET;
    sockaddr.sin_port=htons(6000);

3.套接字和IP地址和端口连接

connect(sockClient,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));

4.发送接收数据给服务器

char recvBuf[100];
    recv(sockClient,recvBuf,100,0);
    printf("%s\n",recvBuf);
    send(sockClient,"服务器你好",strlen("服务器你好")+1,0);

5.关闭套接字

closesocket(sockClient);
    WSACleanup();

别忘了加上头文件#include<winsock2.h>同时要在link一下ws2_32.lib.然后就OK了。

UDP

udp是面向无连接的,广播式的数据传输机制,它的实时性高,输出传输的完整性没法保证,对于一些实时性要求高,完整性要求不高的情况采用UDP。

服务器端

1.加载套接字库

啥也不说了,直接复制

2.创建udp套接字

SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);//这里主要与TCP模式下该参数的区别
   SOCKADDR_IN sockaddr;//创建一个地址结构体,对它的变量进行设置
   sockaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
   sockaddr.sin_family=AF_INET;
   sockaddr.sin_port=htons(6000);

3.将套接字和IP地址和端口绑定

bind(sockSrv,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));//绑定

4.接收数据

这里的接收函数用的是recvfrom();

5.关闭套接字

closesocket(sock);

客户端

1.加载套接字库

啥也不说了,直接复制

2.创建UDP套接字

SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
    SOCKADDR_IN sockaddr;
    sockaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    sockaddr.sin_family=AF_INET;
    sockaddr.sin_port=htons(6000);

3.发送数据

sendto();//发送函数也有区别的

4.关闭套接字

closesocket(sockClient);
  WSACleanup();

别忘了加上头文件#include<winsock2.h>同时要在link一下ws2_32.lib.然后就OK了。

C++ 利用socket实现TCP,UDP网络通讯的更多相关文章

  1. Python的网络编程[0] -> socket[2] -> 利用 socket 建立 TCP/UDP 通信

    Socket 目录 socket 的 TCP/IP 通信基本建立过程 socket 的 UDP 通信基本建立过程 socket 的 UDP 广播式通信基本建立过程 socket 的多线程通信建立过程 ...

  2. 网络编程—网络基础概览、socket,TCP/UDP协议

    网络基础概览 socket概览 socket模块—TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...

  3. Python的网络编程[0] -> socket[0] -> socket 与 TCP / UDP

    Socket socket 简述 / socket Abstract 网络进程通信与 socket 网络中进程之间如何通信,首要解决的问题是如何唯一标识一个进程,否则通信无从谈起.在本地可以通过进程 ...

  4. tcp/ip网络通讯安全加密方法

    tcp/ip网络通讯安全是一个广受关注的话题,现在也有一些基于tcp/ip加密技术标准如SSL,TLS等.但很多时候编写一些简单的网络通讯把这标准加密应用添加进来乎一下子把程序变得复杂了,而实现自己的 ...

  5. Shell 脚本实现TCP/UDP协议通讯

    Shell 脚本实现TCP/UDP协议通讯 http://www.cnblogs.com/occult/archive/2012/12/25/2832183.html  

  6. 网络层、传输层、应用层、端口通信协议编程接口 - http,socket,tcp/ip 网络传输与通讯知识总结

    引: http://coach.iteye.com/blog/2024511 什么是TCP和UDP,以及二者区别是什么? TCP的全称为传输控制协议.这种协议可以提供面向连接的.可靠的.点到点的通信. ...

  7. [网络] SOCKET, TCP/UDP, HTTP, FTP

    (一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...

  8. socket与TCP/UDP编程~

    ket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程,必须理解Socket接口. ...

  9. 3、linux下Socket编程-TCP/UDP

    1.什么是Socket 网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socke ...

随机推荐

  1. asp.net中利用session对象传递、共享数据[session用法]

    下面介绍Asp.net中利用session对象传递.共享数据用法: 1.传递值: 首先定义将一个文本值或单独一个值赋予session,如下: session[“name”]=textbox1.text ...

  2. windows mysql 中文乱码和中文录入提示太大错误的解决方法

    今天操作mysql的时候很郁闷,因为修改默认字符集搞了半天,终于弄成了(关于如何把windows的默认字符集设置成功,可以参看另一篇博文,最终在mysql中输入show variables like ...

  3. Visual Studio 调试技巧 (三) -- 调试第三方组件代码

    上次我们提到,没有源代码而且没有调试符号,我们也可以 Debug.有人可能会问,我什么时候需要在这种情况下调试吗?! 是的.比方说,我们用了某些第三方的组件,这些组件里面难免也会有 Bug.就算是微软 ...

  4. display_errors & error_reporting(php调试安全)

    这两个选项对应的值即都可以在php.ini文件中设置,也都可以在php代码中使用相应的函数来设置. 在php.ini文件中的设置如下:

  5. Android(java)学习笔记185:xml文件生成

    1.xml文件: 用元素描述数据,跨平台. 2.利用传统的方式创建xml文件,下面是一个案例: 设计思路:建立一个学生管理系统,创建xml文件保存学生信息: (1)首先是布局文件activity_ma ...

  6. CentOS 6.7下iPython提示“WARNING: Readline services not available or not loaded.”的解决办法

    yum install readline-devel 然后,使用pip或者easy_install安装readline即可 pip install readline

  7. Python获取web页面信息

    import sys, urllib2 # req = urllib2.Request(sys.argv[1]) req = urllib2.Request('http://www.sina.com. ...

  8. 原生js日期时间插件鼠标点击文本框弹出日期时间表格选择日期时间

    原文出处 (这是我从互联网上搜来的,感觉能满足各方面的需求.个人感觉挺不错的,所以后期修改了一下向大家推荐!) 效果图: html代码: <!DOCTYPE html PUBLIC " ...

  9. (转)asp.net基础-HttpModule

    HttpModule是向实现类提供模块初始化和处置事件.当一个HTTP请求到达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于H ...

  10. android Activity 生命周期

    今天第一次详细学习android,主要了解了一下activity的生命周期,下面详细说一下自己的简介: 在Actity中最主要的有一下几个方法: protectedvoid onCreate(Bund ...