如何用C++Builder控件c语言实现udp通信信

C++使用socket套接字的通信编程实现
程序代码: &链接:
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
程序使用说明:
1.可以直接进文件夹debug中双击*.exe运行程序。
2.要先运行服务器端server.exe在运行客户端client.exe。
3.聊天发送要轮流进行。
程序流程图:
使用到的socket函数(搜集自网络):
创建一个套接口。 #include  SOCKET PASCAL FAR socket( int
af, int type, int protocol); af:一个地址描述。目前仅支持AF_INET格式,也就是说ARPA
Internet地址格式。 type:新套接口的类型描述。 protocol:套接口所用的协议。如调用者不想指定,可用0指定,表示缺省。
-----------------------------------------------------------------------------------------------------------
sockaddr_in
& & short int
& & unsigned
short int sin_&
& & struct
in_addr sin_
& & unsigned
char sin_zero[8];&
sin_family指代协议族,在socket编程中只能是AF_INET
sin_port存储端口号(使用网络字节顺序)
sin_addr存储IP地址,使用in_addr这个数据结构
sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
s_addr按照网络字节顺序存储IP地址
此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。
----------------------------------------------------------------------------------------------------------
功能是:存放windows socket初始化信息.
WSAData {&
szDescription[WSADESCRIPTION_LEN+1];&
szSystemStatus[WSASYSSTATUS_LEN+1];&
short iMaxS&
short iMaxUdpDg;&
* lpVendorI&
wVersion为你将使用的Winsock版本号,wHighVersion为载入的Winsock动态库支持的最高版本,注意,它们的高字节代表次版本,低字节代表主版本。
szDescription与szSystemStatus由特定版本的Winsock设置,实际上没有太大用处。
iMaxSockets表示最大数量的并发Sockets,其值依赖于可使用的硬件资源。
iMaxUdpDg表示数据报的最大长度;然而,获取数据报的最大长度,你需要使用WSAEnumProtocols对协议进行查询。
最大数量的并发Sockets并不是什么神奇的数字,它是由可用的物理资源来决定的.
lpVendorInfo是为Winsock实现而保留的制造商信息,这个在Windows平台上并没有什么用处.
-------------------------------------------------------------------------------------------------------------------------------------------
WSAStartup()函数
WSAStartup
wVersionRequested,
& & &LPWSADATA
使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。该函数执行成功后返回0.例:假如一个程序要使用2.1版本的Socket,那么程序代码如下:
wVersionRequested = MAKEWORD( 2, 1
WSAStartup( wVersionRequested, &wsaData );
返回值:0表示成功。
-------------------------------------------------------------------------------------
socket(int domain,int type,int protocol);
第一个参数domain设置为“AF_INET”。
第二个参数是套接口的类型:SOCK_STREAM或
SOCK_DGRAM。第三个参数设置为0。
系统调用socket()只返回一个套接口描述符,如果出错,则返回-1。
--------------------------------------------------------------------------------------
connect(int sockfd,struct sockaddr* serv_addr,int
第一个参数还是套接口文件描述符,它是由系统调用socket()返回的。
第二个参数是serv_addr是指向数据结构sockaddr的指针,其中包括目的端口和IP地址。
第三个参数可以使用sizeof(structsockaddr)而获得。
----------------------------------------------------------------------------------------------
*memset(void *s,int c,size_t n)
总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。
----------------------------------------------------------------------------------------------
htons函数将一个16位的无符号短整型数据由主机排列方式转换为网络排列方式。
-------------------------------------------------------------------------------------------------
htonl就是把本机字节顺序转化为网络字节顺序
所谓网络字节顺序(大尾顺序)就是指一个数在内存中存储的时候“高对低,低对高”(即一个数的高位字节存放于低地址单元,低位字节存放在高地址单元中)。但是计算机的内存存储数据时有可能是大尾顺序或者小尾顺序。
--------------------------------------------------------------------------------------------------
inet_addr(const char* strptr);
返回:若字符串有效则将字符串转换为32位二进制网络字节序的IPV4地址,否则为INADDR_NONE
----------------------------------------------------------------------------------------------------
  功能:建立与TCP服务器的连接&
  定义:&
connect(int sockfd, struct sockaddr *serv_addr, int
addrlen);&
  //sockfd 是系统调用 socket()
返回的套接口文件描述符&
  serv_addr 是保存着目的地端口和 IP 地址的数据结构 struct
  //addrlen 设置为 sizeof(struct
sockaddr)&
  connect
激发 TCP的三路握手过程&
  服务器必须准备好接受外来的连接。&
------------------------------------------------------------------------------------------------------
如果你希望不连接到远程的主机,也就是说你希望等待一个进入的连接请求,然后再处理它们。这样,你通过首先调用listen(),然后再调用accept()来实现。
系统调用listen()的形式如下:
&listen(int sockfd,int backlog);
第一个参数是系统调用socket()返回的套接口文件描述符。
第二个参数是进入队列中允许的连接的个数。进入的连接请求在使用系统调用accept()应答之前要在进入队列中等待。这个值是队列中最多可以拥有的请求的个数。大多数系统的缺省设置为20。你可以设置为5或者10。当出错时,listen()将会返回-1值。
当然,在使用系统调用listen()之前,我们需要调用bind()绑定到需要的端口,否则系统内核将会让我们监听一个随机的端口。所以,如果你希望监听一个端口,下面是应该使用的系统调用的顺序:
----------------------------------------------------------------------------------------------------------
在一个套接口接受一个连接。accept()
是c语言中网络编程的重要的函数,windows系统在#include ,而linux系统在#include
PASCAL FAR accept( SOCKET s, struct sockaddr FAR* addr,int FAR*
s:套接口描述字,该套接口在listen()后监听连接。
addr:(可选)指针,指向一缓冲区,其中接收为通讯层所知的连接实体的地址。Addr参数的实际格式由套接口创建时所产生的地址族确定。
addrlen:(可选)指针,输入参数,配合addr一起使用,指向存有addr地址长度的整型数。
成功返回一个新的套接字描述符,失败返回-1。
本函数从s的等待连接队列中抽取第一个连接,创建一个与s同类的新的套接口并返回句柄。如果队列中无等待连接,且套接口为阻塞方式,则accept()阻塞调用进程直至新的连接出现。如果套接口为非阻塞方式且队列中无等待连接,则accept()返回一错误代码。已接受连接的套接口不能用于接受新的连接,原套接口仍保持开放。
accept()函数&
& &系统调用 accept()
会有点古怪的地方的!
& &你可以想象发生 这样的事情:有人从很远的地方通过一个你在侦听
(listen()) 的端口连接 (connect()) 到你的机器。它的连接将加入到等待接受 (accept())
的队列中。
& &你调用 accept()
告诉它你有空闲的连接。它将返回一个新的套接字文 件描述符!这样你就有两个套接字了,原来的一个还在侦听你的那个端口, 新的在准备发送
(send()) 和接收 ( recv()) 数据。这就是这个过程!&
&函数是这样定义的:&
accept(int sockfd, void *addr, int *addrlen);
& &sockfd 相当简单,是和 listen()
中一样的套接字描述符。
& &addr 是个指向局部的数据结构 sockaddr_in
的指针。这是要求接入的信息所要去的地 方(你可以测定哪个地址在哪个端口呼叫你)。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
系统调用recv()的使用方法和send()类似:
recv(int sockfd, &void* buf, &int
len, &unsigned int flags);
第一个参数是要读取的套接口文件描述符。
第二个参数是保存读入信息的地址。
第三个参数是缓冲区的最大长度。第四个参数设置为0。
系统调用recv()返回实际读取到缓冲区的
&--字节数---,如果出错则返回-1。
这样使用上面的系统调用,你可以通过数据流套接口来发送和接受信息。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
将一个IP转换成一个互联网标准点分格式的字符串。
* inet_ntoa( struct in_addr in);
arpa/inet.h
Winsock2.h
一个网络上的IP地址
如果正确,返回一个字符指针,指向一块存储着点分格式IP地址的静态缓冲区(同一线程内共享此内存);错误,返回NULL。
-----------------------------------------------------------------------------------------------------------
将一个无符号短整形数从网络字节顺序转换为主机字节顺序。
ntohs(uint16_t netshort);
netshort:一个以网络字节顺序表达的16位数。
本函数将一个16位数由网络字节顺序转换为主机字节顺序。
ntohs()返回一个以主机字节顺序表达的数。
------------------------------------------------------------------------------------------
  功能:给套接口分配一个本地协议地址&
  定义:&
bind(int sockfd, const struct sockaddr *my_addr, int
addrlen);&
  sockfd
是调用 socket 返回的文件描述符。&
  my_addr
是指向数据结构 struct sockaddr 的指针,保存地址(即端口和 IP 地址)
  addrlen
设置为 sizeof(struct sockaddr)。&
  返回:
0—成功, -1---出错&
  让内核自动处理地址ip和端口port&
  my_addr.sin_port = 0;
  my_addr.sin_addr.s_addr = INADDR_ANY;
  bind( )
自己选择合适的端口:将0赋给 my_addr.sin_por。&
  自动填上他所运行的机器的 IP 地址:my_addr.sin_addr.s_addr 设置为
INADDR_ANY。&
一般情况下,如果你要建立网络服务器应用程序,则你要通知服务器操作系统:请在某地址
xxx.xxx.xxx.xxx上的某端口
yyyy上进行侦听,并且把侦听到的数据包发送给我。这个过程,你是通过bind()系统调用完成的。——也就是说,你的程序要绑定服务器的某地址,或者说:把服务器的某地址上的某端口占为已用。服务器操作系统可以给你这个指定的地址,也可以不给你。
---------------------------------------------------------------------------------------
WSACleanup()&
  中止Windows Sockets DLL的使用.
&int PASCAL FAR WSACleanup ( void );
& &应用程序或DLL在使用Windows
Sockets服务之前必须要进行一次成功的WSAStartup()调用.当它完成了Windows
Sockets的使用后,应用程序或DLL必须调用WSACleanup()将其从Windows
Sockets的实现中注销,并且该实现释放为应用程序或DLL分配的任何资源.任何打开的并已建立连接的SOCK_STREAM类型套接口在调用WSACleanup()时会重置;
而已经由closesocket()关闭却仍有要发送的悬而未决数据的套接口则不会受影响- 该数据仍要发送.
.cn/s/blog_6b51em.html
-------------------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
send(SOCKET s, &const char *buf,
& &int len, &
&int flags);
参数描述:
& 发送端套接字描述符
char *buf &应用程序要发送的数据的缓冲区(想要发送的数据)
& &实际要发送的字节数
&一般置为0即可
同步Socket的send函数的执行流程如下:
调用该函数时,send先比较待发送数据的长度len与套接字s的发送缓冲区的长度(区别于buf),如果len大于s的发送缓冲区的长度,则函数返回SOCKET_ERROR;
如果len小于或者等于s发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲区中的数据:
& a.如果是在发送,就等待协议将数据发送完毕。 &
b.如果没有开始发送s的缓冲区中的数据,那么send就比较s的发送缓冲区的剩余空间和len的大小:
如果len大于发送缓冲区剩余空间大小(不足放入剩余发送缓冲区),send就一直等待协议把s发送缓冲区中的数据发送完;
如果len小于发送缓冲区剩余空间大小,就仅仅把buf中的数据copy到发送缓冲区的剩余空间里(send函数返回时并不代表send把s的缓冲区的数据(buf)传到连接的另一端,而是协议传输的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间中)。&
&Socket中send函数的理解(一)如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;如果send在等待协议传送数据时断开网络,那么send函数也返回SOCKET_ERROR。
要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间后就返回了,但是此时这些数据并不一定马上被传到连接的另一端。如果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR.(每一个除send之外的Socket函数在执行的最开始总要先等待套接字的发送缓冲区中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回SOCKET_ERROR)。
///////////////////////////////////////////////////////////////////////////////////////////////////////////
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。11:27 提问
c++ 用WebSocket 实现通信
有一个需求
服务端是用java写的 用的WebSocket协议通信
服务商只提供了数据包的数据结构
我想知道websocket用c++怎么建立连接
会的最好提供下实例代码 拜托了
按赞数排序
你可以先去弄清楚网络OSI参考模型。连接传输不是TCP就是UDP。
自己google C++ implement websocket client
4343关注|1193收录
其他相似问题君,已阅读到文档的结尾了呢~~
udp通信 java udp通信 udp通信过程 udp通信协议 linux udp 异步通信 android udp通信 udp网络通信 udp实现文件传输 自我实现 实现梦想
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
C++Builder下三种UDP通信实现方法的比较
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口socket 使用C++ Builder实现 通讯的小例子。 Windows Develop 238万源代码下载-
&文件名称: socket
& & & & &&]
&&所属分类:
&&开发工具: C++ Builder
&&文件大小: 335 KB
&&上传时间:
&&下载次数: 78
&&提 供 者:
&详细说明:使用C++ Builder实现socket通讯的小例子。
文件列表(日期:~)(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&jd&&..\socket.bpr&&..\&&..\socket.exe&&..\socket.obj&&..\socket.res&&..\socket.tds&&..\&&..\&&..\&&..\Unit1.obj&&..\Unit1.~cpp&&..\Unit1.~dfm&&..\Unit1.~h
&[]:纯粹是垃圾
&近期下载过的用户:
&&&&&&&&[]
&相关搜索:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - send data using udp
&[] - socket知识介绍,Socket建立过程详细描述,TServerSockett和TClientSocket的源代码
&[] - socket程序,用c++builder实现的UDP协议
&[] - socket 服务器端,创建套接字,绑定,监听,接收等操作.
&[] - C++ builder 6.0 Socket控件TCP通信,服务器和客服端都有。
&[] - Socket example source code
&[] - c++ builder socket 通讯
&[] - 一本学习C++builder的好书,特别适合初学者,内容全面包括编程技巧,组件使用等.
&[] - C++ builder 6.0 Socket控件TCP通信,服务器和客服端都有
&[] - 用windows开发可用于实现通信的 TCP协议,实现在线人数查询,通信对话内容记录等一、网络中进程之间如何通信?
&&&&&socket一词的起源:在组网领域的首次使用是在日发布的文献中发现的,撰写者为Stephen Carr、Steve Crocker和Vint Cerf。根据美国计算机历史博物馆的记载,Croker写道:&命名空间的元素都可称为套接字接口。一个套接字接口构成一个连接的一端,而一个连接可完全由一对套接字接口规定。&计算机历史博物馆补充道:&这比BSD的套接字接口定义早了大约12年。&
3.3、网络字节序与主机字节序
主机字节序:就是我们平常说的大端和小端模式:不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序,这个叫做主机序。引用标准的Big-Endian和Little-Endian的定义如下:
  a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
  b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
3.4、listen()、connect()函数
SYN表示建立连接,
FIN表示关闭连接,
ACK表示响应,
PSH表示有 DATA数据传输,
RST表示连接重置。
我们知道tcp建立连接要进行&三次握手&,即交换三个分组。大致流程如下:
&&&&&& 只有就完了三次握手,但是这个三次握手发生在socket的那几个函数中呢?请看下图:
阅读(...) 评论()

我要回帖

更多关于 c实现udp通信 的文章

 

随机推荐