tcp/udp建立连接并通信的过程

基于TCP的socket编程的服务器程序流程如下:

1.创建套接字

SOCKETsockSrv = socket(AF_INET, SOCK_STREAM, 0) ;

2.将套接字绑定到本地地址和端口上

       SOCKADDR_INaddrSrv ;                                                                  

       addrSrv.sin_addr.S_un.S_addr =htonl(INADDR_ANY) ;                   //把一个u_long类型的值转化为网络字节顺序

       addrSrv.sin_family = AF_INET ;

       addrSrv.sin_port = htons(6000) ;

       bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)) ;              //绑定创建了的套接字   

 

3.将创建的套接字设为监听模式,等待接收客户端的请求

listen(sockSrv,5) ;         

4.等待客户请求的到来,当请求到来后,接收连接请求,返回一个新的对于与此次连接的套接字

SOCKETsockConn = accept(sockSrv, (SOCKADDR *)&addrClient, &len) ;

5.用返回的套接字和客户端进行通信

send(sockConn,szSendBuf, lstrlen(szSendBuf) + 1, 0) ;

recv(sockConn, szRecvBuf, 100, 0) ;

6.返回,等待另一个客户的请求

closesocket(sockConn) ;

7.关闭套接字

 

基于TCP的socket编程的客户端程序流程如下:

1.创建套接字

SOCKETsockClient = socket(AF_INET, SOCK_STREAM, 0) ;

 

2.向服务器发出连接请求

       

       SOCKADDR_INaddrSrv ;

       addrSrv.sin_addr.S_un.S_addr =inet_addr("192.168.0.1") ;

       addrSrv.sin_family = AF_INET ;

       addrSrv.sin_port = htons(6000) ;

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

 

3.和服务器进行通信

recv(sockClient,szRecvBuf, 100, 0) ;

send(...)

 

4.关闭套接字

 

基于UDP的socket编程的接收端序流程如下:

1.创建套接字

SOCKETsockSrv = socket(AF_INET, SOCK_DGRAM, 0) ;

2.将套接字绑定到本地地址和端口上

       

       SOCKADDR_INaddrSrv ;

       addrSrv.sin_family = AF_INET ;

       addrSrv.sin_port = htons(6000) ;

       addrSrv.sin_addr.S_un.S_addr =htonl(INADDR_ANY) ;

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


3.等待接收数据

       SOCKADDR_INaddrClient ;

       int len = sizeof(SOCKADDR) ;

       TCHAR szRecvBuf[100] ;

       recvfrom(sockSrv, szRecvBuf,lstrlen(szRecvBuf) + 1, 0, (SOCKADDR       *)&addrClient,&len) ;


4.关闭套接字

 

基于UDP的socket编程的客户端序流程如下:

1.创建套接字

SOCKETsockClient = socket(AF_INET, SOCK_DGRAM, 0) ;

 

2.向服务器发送数据

       SOCKADDR_INaddrSrv ;

       addrSrv.sin_addr.S_un.S_addr =inet_addr("192.168.0.1") ;

       addrSrv.sin_family = AF_INET ;

       addrSrv.sin_port = htons(6000) ;

 

       sendto(sockClient,TEXT("Hello"), lstrlen(TEXT("Hello")) + 1, 0, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)) ;

 

3.关闭套接字


关于recv、send发送字节数问题:

send((sockConn,szFileBuffer, nLength, 0)函数会发送nLenth个字节,如果nLength大于szFileBuffer的大小,那么多余的字节以\0补充。如果小于szFileBuffer的大小,则会发送szFileBuffer字符串截取nLength个字节。

 

recv((sockConn,szFileBuffer, nLength, 0)函数原则与上面的一样,只是当nLength大于szFileBuffer的长度时,不会以\0来填充。

同时send,recv函数遇到\0会同样发送和接收。

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值