一、一些概念

套接字是表示了通信的端点。

网络通信中,使用“连接”作为最基本的抽象,同时将TCP连接的端点称为套接字。套接字=(IP,端口)

二、连接过程

服务器端(接收端)程序:
1、创建套接字(socket)。 
2、将套接字绑定到一个本地地址和端口上(bind)。
3、等待接收数据(recvfrom)。
4、关闭套接字。
客户端(发送端)程序:
1、创建套接字(socket)。 
2、向服务器发送数据(sendto)。
3、关闭套接字。

三、示例程序

服务器端:

#include <Winsock2.h>
#include <stdio.h>

void main()
{
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;
}

SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char recvBuf[100];

recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
printf("%s\n",recvBuf);
closesocket(sockSrv);
WSACleanup();
}

客户端:

#include <Winsock2.h>
#include <stdio.h>

void main()
{
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;
}

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

sendto(sockClient,"Hello",strlen("Hello")+1,0,
   (SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();
}

由上我们可以看出,在TCP连接中,客户端不需进行绑定socket与地址,只需提出连接申请。而服务器端需要通过bind把套接字绑定到本地地址与指定的端口上。

而在UDP连接中,服务器端同样需绑定一个socket与一个端接口,而客户端不要绑定,不要连接,可直接发送。事实上,在UDP通信中,服务器端和客户端是相对的,两端可以同时为服务器端和客户端。

具体细节可以参考孙的书关于UDP的聊天部分。

还有TCP/IP协议中采用的是高位先存格式(高地址存低字节)。

参考:

[1] 孙鑫 《vc++深入》

[2] MSDN

[3] http://hi.baidu.com/buddhist_byr/blog/item/4acfe1a24d0a20a9caefd01f.html

转载于:https://www.cnblogs.com/mydomain/archive/2010/08/12/1798483.html

2、网络编程之基于UDP示例相关推荐

  1. java网络编程作业基于UDP简单聊天窗口,图形化界面,包含客户端和服务端

    //郑州轻工业大学 //题号:实验四 第二题 //题目:使用基于UDP的网络编程方法,完成客户端和服务器间的聊天功能.要求图形界面. java网络编程作业 基于UDP简单聊天窗口,图形化界面,包含客户 ...

  2. Linux网络编程:基于UDP的程序开发回顾篇

    基于无连接的UDP程序设计 同样,在开发基于UDP的应用程序时,其主要流程如下: 对于面向无连接的UDP应用程序在开发过程中服务端和客户端的操作流程基本差不多.对比面向连接的TCP程序,服务端少了li ...

  3. 【Linux网络编程】基于UDP实现多人聊天室

    文章目录 一.UDP的概念 1.1 UDP 1.2 UDP特点 二. 采用UDP实现多人聊天室原因 三.多人聊天室项目功能 四.实现多人聊天室项目流程分析 4.1 前期准备 4.1.1 定义结构体 4 ...

  4. 网络编程(基于socket接口技术的进程间通信)接上一篇文章补充

    目录 一.网络编程(基于socket接口技术) 1.基于TCP协议的网络通信 编程模型: 2.基于UDP通信协议的网络通信 编程模型: 3.新增函数: 大小端数据转换函数: ip地址转换函数: TCP ...

  5. socket recv 服务端阻塞 python_网络编程(基于socket编程)

    网络编程(基于socket编程) socket套接字:应用程序通常通过socket"套接字"向网络发送请求或应答网络请求,是主机间或同一计算机中的进程间相互通讯 socket是介于 ...

  6. python网络通信编程实例_python网络编程之数据传输UDP实例分析

    本文实例讲述了python网络编程之数据传输UDP实现方法.分享给大家供大家参考.具体分析如下: 一.问题: 你觉得网络上像msn,qq之类的工具在多台机器之间互相传输数据神秘吗?你也想玩一下在两台机 ...

  7. TCP/IP网络编程之基于TCP的服务端/客户端(二)

    回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...

  8. TCP/IP网络编程之基于TCP的服务端/客户端(一)

    TCP/IP网络编程之基于TCP的服务端/客户端(一) 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字.因为TCP套接字是面向连接的,因此又称为基于 ...

  9. 21天学会Java之(Java SE第十三篇):网络编程、TCP/UDP通信

    如今,计算机已经成为人们学习.工作.生活必不可少的工具.人们利用计算机可以和亲朋好友在网上聊天,玩网游或发邮件等,这些功能的实现都离不开计算机网络.计算机网络实现了不同计算机之间的通信,而这些必须依靠 ...

最新文章

  1. 查看Linux发行版的名称和版本号
  2. HDU1588(矩阵连乘求和)
  3. php 序列化有上限,总结对比php中的多种序列化
  4. “睡服”面试官系列第二十一篇之class基本语法(建议收藏学习)
  5. HTML音乐播放没声音,网页没有声音但系统显示有声音怎么回事?如何解决?
  6. 我是如何白嫖 Github 服务器自动抓取每日必应壁纸的?
  7. Java16-java语法基础——异常
  8. Django-----模板嵌套
  9. AC日记——A+B Problem(再升级) 洛谷 P1832
  10. 华为onu 调为交换机_华为MA5626配置成普通交换机的方法.docx
  11. Cairo-基本概念
  12. 用Java编程卫星坐标_2 分钟掌握卫星星座图
  13. Java实验3 第十二题:财务应用程序:信用卡号的合法性
  14. VRay Next for SketchUp 泳池水材质制作教程
  15. 【应用篇】MyBatis学习笔记
  16. 计算机软件投资所得税减免,个人以计算机软件著作权增资可以享受延迟纳个税的优惠吗...
  17. 竞赛通知|2021年全国大学生电子设计竞赛启动通知!
  18. freecodecamp_freeCodeCamp发布样式指南
  19. Shader头发效果
  20. win7桌面的计算机在哪里设置密码,win7如何添加屏幕保护密码|win7设置屏幕保护密码的方法...

热门文章

  1. oracle归档日志太多(ORA-00257: archiver error. Connect internal only, until freed)错误的处理方法
  2. Android6.0之后的权限机制对App开发的影响
  3. Android开发笔记(七十)反编译初步
  4. AD程序设计c语言,AVR AD转换的C语言编程
  5. ngxin做http强制跳转https,接口的POST请求变成了GET
  6. c语言 static变量和函数
  7. 简述关系型数据库和非关系型数据库
  8. windows 哪些服务必须打开
  9. [android] socket在手机上的应用
  10. [NHibernate]集合类(Collections)映射