基于TCP协议的网络通信设计与实现

利用socket函数创建套接字创建套接字创建套接字将这个套接字绑定到本地一个本地的某个地址和端口这时需要调用bind函数将套接字绑定到一个本地地址口上将套接字绑定到一个本地地址口上调用listen函数将套接字设置为监听模式将套接字设置为监听模式(listen)(listen)准备接受客户请求准备接受客户请求调用accept函数等待并接受客户连接请求等待客户请求到来;当请求到来后,等待客户请求到来;当请求到来后,接受连接请求接受连接请求返回一个新的对应于返回一个新的对应于此连接的套接字(accept)此连接的套接字(accept)用send函数向客户发送端数据用放回套接字和用户进行通信用放回套接字和用户进行通信(send/recv)(send/recv)调用closesocket返回返回等待另一客户请求等待另一客户请求关闭监听需要调用WASCleanup关闭套接字关闭套接字

4、系统的实现 4.1、服务器端程序 #include #include Void main() {

//加载套接字库

WORD wVersionRequested; WSADATA wsaDdata; Int error;

wVersionRequested=MAKEWORD(1,1);

err=WSAStarup(wVersionRequested,&wsaDATA);

if(err!=0) {

return; }

If(LOBYTE(wsadata.wVersion)!=1||HIBYTE(wsadata.wVersion)!=1) {

WSACleanup(); Return; }

//创建用于监听的套接字

SOCKET sockSrv=socket (AF-INET,SOCK-STREAM,0); SOCKADDR-IN addrSrv;

addrSrv.sin-addr.S-un.S-addr=hotonl(INADDR-ANY); addrSrv.sin-family=AF-INET; addrSrv.sin-port=htons(6000)

//绑定套接字

Bind(sockSrv ,(SOCKADDR*)&addrSrv ,sizeof(SOCKADDR)); //将套接字设为监听模式,准备接收客户请求 Listen(sockSrv,s);

SOCKADDR-IN addrClient; Int len=sizeof( SOCKADDR );

While(1) {

//等待客户请求到来

SOCKET sockConn=accept(sockSrv ,( SOCKADDR*)&addrClient ,&len); Char sendBuf(100);

Sprintf(sendBuf ,)”Welcom %s to http://www.sunxin.org” ,ine-ntoa(addrClient.sin-addr));

//发送数据

Send(sockConn ,sendbuf ,strlen(sendBuf)+1,0); Char recvBuf(100);

//接受数据

Recv(sockConn,recvBuf ,100 ,0);

//打印接受的数据

Printf(“%s\\n”,recvBuf);

//关闭套接字

Closesocket(sockConn); } }

4.2、客户端程序

#include #include Void main() {

//加载套接字库

WORD wVersionRequested; WSADATA wsaDdata; Int error;

wVersionRequested=MAKEWORD(1,1);

err=WSAStarup(wVersionRequested,&wsaDATA);

if(err!=0) {

return; }

If(LOBYTE(wsadata.wVersion)!=1||HIBYTE(wsadata.wVersion)!=1) {

WSACleanup(); Return; }

//创建套接字

SOCKET sockSrv=socket (AF-INET,SOCK-STREAM,0); SOCKADDR-IN addrSrv;

addrSrv.sin-addr.S-un.S-addr=hotonl(INADDR-ANY); addrSrv.sin-family=AF-INET; addrSrv.sin-port=htons(6000)

//向服务器发出连接请求

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

//接受数据

Char recvBuf[100];

Recv(sockClient , recvBuf ,100 ,0); Printf(“%s\\n”,recvBuf);

//发送数据

Send(sockClient ,” This is lisi ”, strlen(“This in lisi”)+1 ,0); //关闭套接字

Closesocket(sockConn); WSACLeanup() ; } }

结论

在此设计中仅仅适合于数量少的计算机间的通信,其中一个缺陷是,当多台计算机同时进行通信时,会照成网络拥塞,可能导致消息传输中丢失,此设计没有做出解决的方案,但有这样的方案猜想,为了解决拥塞问题,可以使用慢开始、拥塞避免、快从传和快恢复算法,进而改进此设计,但是这会涉及大量的数学运算。此设计还存另一个缺陷,没有实现可靠传输,TCP协议的可靠传输机制是用字节的序号进行传输控制,而这里仅是监听端口是否有数据发送,如果有,就接收,没有就继续监听。

参考文献

[1]孙鑫,VC++深入详解[M]北京:电子工业出版社,2012.7:528-546 [2]谢希仁,计算机网络[M]北京:电子工业出版社,2008.1:180-210

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4