基于TCP协议的socket编程实例

用打电话的过程来模仿tcp协议的网络传输。

套接字:好比电话机。

我们先要装电话机(加载套接字库),作为服务器的一方必须与电话机形成一对一的关系才能接到电话(绑定bind),要想接到电话必须守候在电话机旁边(监听listen),当有电话过来的时候,服务器必须拿起电话(accept),在这个过程中,当服务器得知客户端的详细信息后,于是接收和发送消息(recv与send),最后放下电话(释放套接字),离开电话机(释放资源)。

作为客户端,要想给服务器打电话,同样装电话(加载套接字库),就必须请求电信局帮忙连接(请求连接connect),当服务器端接受以后,就可以进行通话(send与recv)。

首先我们在运用tcp协议方面的知识去编程的时候得了解的步骤:

1.服务器端的程序编写:

首先,加载套接字库。WSAStartup进行加载,参看msdn。

创建套接字:SOCKET创建对象。

绑定到本地的主机和端口:用bind函数

进行监听:listen()进行监听。其中这个函数可以设置消息队列的数目,超过这个数再请求就会失败。

当有客户端请求的时候,则accept进行接受请求。

然后运用recv和send进行通话。

2.客户端程序的编写:

首先加载套接字库。WSAStartup,同上

请求连接:connect。

当服务器统一建立连接的时候,就可以用recv与send进行通信了。

以下分别是一个服务器端和一个客户端的程序:

#includestdio.h//注意:我们还得在工程中加载dll,加载的是WS2_32.lib库文件。

#includeWINSOCK2.H

voidmain()

{

WORDwVersionRequested;

WSADATAwsaData;

interr;

wVersionRequested=MAKEWORD(1,1);

err=WSAStartup(wVersionRequested,&wsaData);

if(err!=0){

return;

}

if(LOBYTE(wsaData.wVersion)!=1

HIBYTE(wsaData.wVersion)!=1)

{

WSACleanup();

return;

}

SOCKETsockSrv=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_INaddrSrv;

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

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(6000);

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

listen(sockSrv,5);

//SOCKETsockClient;

SOCKADDR_INaddrConn;

intlen=sizeof(SOCKADDR);

while(1)

{

SOCKETsockClient=accept(sockSrv,(SOCKADDR*)&addrConn,&len);

charszBuffer[100];

sprintf(szBuffer,"welcome%stohttp://www.sunxin.org",

inet_ntoa(addrConn.sin_addr));

send(sockClient,szBuffer,sizeof(szBuffer)+1,0);

charszRecv[100];

recv(sockClient,szRecv,100,0);

printf("%s",szRecv);

}

}

客户端的程序:

#includestdio.h

#includeWINSOCK2.H

voidmain()

{

WORDwVersionRequested;

WSADATAwsaData;

interr;

wVersionRequested=MAKEWORD(1,1);

err=WSAStartup(wVersionRequested,&wsaData);

if(err!=0){

return;

}

if(LOBYTE(wsaData.wVersion)!=1

HIBYTE(wsaData.wVersion)!=1)

{

WSACleanup();

return;

}

SOCKETsockClient=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_INaddrSrv;

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

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(6000);

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

charszBuffer[100];

recv(sockClient,szBuffer,100,0);

printf("%s",szBuffer);

send(sockClient,"thisiszhangsan",sizeof("thisiszhangsan")+1,0);

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值