社区
网络编程
帖子详情
Winsock,TCP通信接收方的疑问。
i ama
2005-10-17 09:21:12
用TCP通信,发送方在发送消息的时候消息间用分割符分开
比如发送方依次发送下面4条消息:
AAAAAA#
BBBBBB#
CCCCCC#
DDDDDD#
由于网络传输速度的问题,此时接收方有没有可能接收到这样两条消息:
AAAAAA#BBBBBB#CCC
CCC#DDDDDD#
即一次完整的发送“CCCCCC#”被截断了?
...全文
446
10
打赏
收藏
Winsock,TCP通信接收方的疑问。
用TCP通信,发送方在发送消息的时候消息间用分割符分开 比如发送方依次发送下面4条消息: AAAAAA# BBBBBB# CCCCCC# DDDDDD# 由于网络传输速度的问题,此时接收方有没有可能接收到这样两条消息: AAAAAA#BBBBBB#CCC CCC#DDDDDD# 即一次完整的发送“CCCCCC#”被截断了?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
MFCBibe
2005-10-23
打赏
举报
回复
TCP 发送的是 stream,没有分割点。
UDP 发送的是 消息包,有分割点。
建议看看 windows网络编程技术 这本书,网络上有 PDF 下载的。
xxrl
2005-10-19
打赏
举报
回复
数据包头部包含数据包长度,解析长度,判断,错误则丢弃,发送重新请求指令
bm1408
2005-10-18
打赏
举报
回复
典型的粘包问题~~
hjunxu
2005-10-18
打赏
举报
回复
晕哦。
这类问题因该搞个faq格。
Caps77
2005-10-18
打赏
举报
回复
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=207387
alexpdl
2005-10-18
打赏
举报
回复
你需要在TCP数据包之前加上二个字节,来标识该包的长度,
接收端分析,再组成一个个完整的包,做法是,
把收到的数据包先放到一个大的缓冲区中,然后从每次先读包的长度的二字节,
再根据这个长度读后面的数据。
lifengice0706
2005-10-17
打赏
举报
回复
会有这种现象的,这是tcp的粘包,楼上说得带长度是个好办法!
worlftki
2005-10-17
打赏
举报
回复
这就是网络粘包的问题。如果要区分最好在每段数据之前发之前加上长度,收到之后再解析。
当然也可以收发之前都清空缓冲区。
property1
2005-10-17
打赏
举报
回复
gz
Jexhat
2005-10-17
打赏
举报
回复
可能哦
WinSock
有连接
通信
WinSock
提供了对
TCP
(传输控制协议)的支持,通过
TCP
协议我们可以与指定IP地址的主机建立,同时利用建立的连接可以双向的交换数据。利用CSocket操纵有连接数据交换很简单,但是在有连接的
通信
中必需有一
方
扮演服务器的角色等待另一
方
(客户
方
)的连接请求,所以服务器
方
需要建立一个监听套接口,然后在此套接口上等待连接。当连接建立后会产生一个新的套接口用于
通信
。而客户
方
在创建套接口后只需要简单的调用连接函数就可以创建连接。对于有连接的
通信
不论是数据的发送还是发送与
接收
的顺序都是有保证的。
利用
WinSock
编程接口,实现点对点
通信
WinSock
是Windows 操作系统下的Socket 编程接口,通过
WinSock
函数库可以实现基于
TCP
/IP 协议的进程之间
通信
。Wireshark 是一个网络分析工具,可以利用该工具捕获本机网络出口处的网络流量(网络包)。 实验要求: (1) 基于
WinSock
开发一个简单的客户/服务器消息传输程序,客户端能够发送由标准输入得到的消息(字符串输入),服务器能够
接收
并将其显示在标准输出上。 (2) 利用Wireshark 软件捕获上述
通信
中的网络包,并分析网络包的以太网头信息、IP 头信息。
TCP
一对多
通信
_基于MFC多线程
我用MFC VC6编写的一个
TCP
一对多
通信
的程序,就是服务器端利用多线程技术(不使用Select等任何模型), 能同时
接收
多个客户端的消息, 其次, 服务器端还能将消息群发给所有已连接的客户端, 实现的基本思路 是将每个线程中 accept函数返回的套接字 都保存到一个套接字数组中,套接字地址也保存到一个数组中。然后在“群发”的 按钮消息中,用for循环 遍历套接字数组,循环执行 send函数将消息发送给套接字数组中所有的套接字。 该程序简单完整,非常适合初学者研究
WinSock
一对多
通信
winsock
带注册文件
一、
WinSock
简介 Socket(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX操作系统开发的网络
通信
接口,随着UNIX的广泛使用,Socket成为当前最流行的网络
通信
应用程序接口之一。20世纪90年代初,由Sun Microsystems,JSB,FTP software,Microdyne和Microsoft等几家公司共同定制了一套标准,即Windows Socket规范,简称
WinSock
。 VB编写网络程序主要有两种
方
式:1.
winsock
控件 2.
winsock
API 二、
WinSock
控件的使用 1.
WinSock
控件的主要属性 LocalHostName属性 本地机器名 LocalIP属性 本地机器IP地址 LocalPort属性 本地机器
通信
程序的端口(0<端口<65536) RemoteHost属性 远程机器名 RemotePort属性 远程机器的
通信
程序端口 Protocol属性 通过Protocol属性可以设置
WinSock
控件连接远程计算机使用的协议。可选的协议是
TCP
和UDP对应的VB的常量分别是sck
TCP
Protocol和sckUDPProtocol,
Winsock
控件默认协议是
TCP
。注意:虽然可以在运行时设置协议,但必须在连接未建立或断开连接后。 SocketHandle属性 返回当前socket连接的句柄,这是只读属性。 RemoteHostIP属性 属性返回远程计算机的IP地址。在客户端,当使用了控件的Connect
方
法后,远程计算机的IP地址就赋给了RemoteHostIP属性,而在服务器端,当ConnectRequest事件后,远程计算机(客户端)的IP地址就赋给了这个属性。如果使用的是UDP协议那么当DataArrival事件后,发送UDP报文的计算机的IP才赋给了这个属性。 ByteReceived属性 返回当前
接收
缓冲区中的字节数 State属性 返回
WinSock
控件当前的状态 常数 值 描述 sckClosed 0 缺省值,关闭。 SckOpen 1 打开。 SckListening 2 侦听 sckConnectionPending 3 连接挂起 sckResolvingHost 4 识别主机。 sckHostResolved 5 已识别主机 sckConnecting 6 正在连接。 sckConnected 7 已连接。 sckClosing 8 同级人员正在关闭连接。 sckError 9 错误 2.
WinSock
主要
方
法 Listen
方
法
方
法用于服务器程序,等待客户访问。格式:
Winsock
对象.listen Connect
方
法 用于向远程主机发出连接请求。格式:
Winsock
对象.connect [远程主机IP,远程端口] Accept
方
法 用于接受一个连接请求。格式:
Winsock
对象.accept Request ID Senddata
方
法 用于发送数据。格式:
Winsock
对象.senddata 数据 Getdata
方
法 用来取得
接收
到的数据。格式:
Winsock
对象.getdata 变量 [,数据类型 [,最大长度]] Close
方
法 关闭当前连接。格式:
Winsock
对象.close Bind
方
法 用Bind
方
法可以把一个端口号固定为本控件使用,使得别的应用程序不能再使用这个端口。 Listen
方
法Listen
方
法只在使用
TCP
协议时有用。它将应用程序置于监听检测状态。 Connect
方
法 当本地计算机希望和远程计算机建立连接时,就可以调用Connect
方
法。Connect
方
法调用的规范为:Connect RemoteHost,RemotePort Accept
方
法 当服务器
接收
到客户端的连接请求后,服务器有权决定是否接受客户端的请求。 SendData
方
法当连接建立后,要发送数据就可以调用SendData
方
法,该
方
法只有一个参数,就是要发送的数据。 GetData
方
法 当本地计算机
接收
到远程计算机的数据时,数据存放在缓冲区中,要从缓冲区中取出数据,可以使用GetData
方
法。GetData
方
法调用规范如下:GetData
MFC中基于
TCP
的客户端与服务端
通信
MFC中基于
TCP
的客户端与服务端的
通信
// client.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include #define PORT 5000 #define BUFFER 1024 void main(int argc,char *argv[]) { WSADATA wsaData; SOCKET client; int port=PORT; //从服务器
接收
的数据长度 int iLen; //接受数据的缓冲 char buf[BUFFER]; //服务器端地址 struct sockaddr_in serv; //判断输入的参数是否正确 /*if(argc<2) //注释掉了输入参数问题 { //提书输入服务器IP地址 printf("Input the server IP address:\n"); return ; } */
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章