tcp/udp建立连接并通信的过程
2014-07-21 15:31
429 查看
基于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会同样发送和接收。
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会同样发送和接收。
相关文章推荐
- 网络通信过程 及TCP/UDP 面向连接?
- 网络通信过程 及TCP/UDP 面向连接?
- TCP协议连接建立与连接断开过程(含断开时的TCP状态图)
- TCP/IP 建立连接的过程(3-way shake)
- API SOCKET基础(一) TCP建立连接并通信
- libjingle源码解析(3)-【PseudoTcp】建立UDP之上的TCP(1):连接和关闭
- TCP的连接建立过程
- TCP连接的建立过程
- TCP/IP 协议简单分析(建立连接握手过程)
- API SOCKET基础(一) TCP建立连接并通信
- JavaSE第一百零九讲:TCP连接建立的一般过程与代码详解
- TCP建立连接三次握手及其断开过程
- TCP数据报头和TCP连接建立过程
- 实例解说TCP连接建立及结束过程详解
- TCP建立连接及断开的几次握手过程
- TCP连接建立过程中为什么需要“三次握手”[转载]
- MD231 gprs模块建立tcp或udp连接,AT命令详细参考
- TCP连接的建立以及利用tcpdump分析连接建立的过程
- 使用ZLG TCP/IP建立多个UDP连接的注意事项
- 实例解说TCP连接建立及结束过程详解