1、 /客户地址长度 int iLen=0; /发送的数据长度 int iSend=0; /接收的数据长度 int ircv =0; /处世要发送给客户的信息 char buf20=I am a server; /接收来自用户的信息 char fromcli512; /客户和效劳器的SOCKET地址构造 struct sockaddr_in ser,cli; if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) coutfailed to load winsockendl; return 0; server waiting- /创立效劳器端帧听SOCKET oldSo
2、cket=socket(AF_INET,SOCK_STREAM,0); if(oldSocket=INVALID_SOCKET)socket() failed:WSAGetLastError() /以下是建立效劳器端的SOCKET地址构造 ser.sin_family=AF_INET; ser.sin_port=htons(5050); /使用系统指定的ip地址INADDR_ANYif(bind(oldSocket,(LPSOCKADDR)&ser,sizeof(ser)=SOCKET_ERROR)bind() failed: /进入侦听状态 if(listen(oldSocket,5)=SO
3、CKET_ERROR)listen() failed: /接收客户端的连接 iLen=sizeof(cli); newSocket=accept(oldSocket,(struct sockaddr*)&cli,&iLen);/产生一个新的SOCKET if(newSocket=INVALID_SOCKET) coutaccept() failed:/ return 0; /进入一个无限循环,等待客户发送数据 while(1) i+; /效劳器初始化接收缓冲区memset(fromcli,0,512); ircv=recv(newSocket,fromcli,sizeof(fromcli),0
4、); if(ircv=SOCKET_ERROR)rcv() failed: break; else if(ircv=0) break; else -效劳器接收的容为-fromclistdio.h#define DATA_BUFFER 512 SOCKET sClient; char ch;随着程序所在主机的地址改变而改变int SeriPort=5050; /从效劳器接收的数据的长度int iLen;int isnd; /接收缓冲区char bufDATA_BUFFER; /发送缓冲区char sndbufDATA_BUFFER; /效劳器端SOCKET地址构造struct sockaddr_
5、in ser; /接收/发送缓冲区的初始化memset(buf,0,sizeof(buf); memset(sndbuf,0,DATA_BUFFER); /填写要连接的效劳器地址信息ser.sin_family=AF_INET; ser.sin_port=htons(SeriPort); /建立客户端字节流式套接字sClient=socket(AF_INET,SOCK_STREAM,0); if(sClient=INVALID_SOCKET)socket() failed : /请求与效劳器建立连接/ coutset link if(connect(sClient,(struct sockad
6、dr *)&ser,sizeof(ser)=INVALID_SOCKET)connect() failed: else /向效劳器端发送数据while(1) cout i+;第isndbuf; isnd=send(sClient,sndbuf,sizeof(sndbuf),0); if(isnd=0) return 0; else if(isnd=SOCKET_ERROR) coutsend() failed: -客户端发送容为-sndbuf closesocket(sClient);本机上客户端与效劳器端通信结果如图:在两台效劳器上分别运行效劳器端和客户端,结果如图:UDP通信#includ
7、e stdafx.h#include #define buffer_length 512void main() WSADATA wsadata; SOCKET sSocket; int ilen; int irecv; char recv_bufbuffer_length; char send_bufbuffer_length; /效劳器和客户SOCKET地址构造struct sockaddr_in seradd,cliadd;wsadata)! printf(failed to load winsocketn); return; sSocket=socket(AF_INET,SOCK_DGR
8、AM,0); if(sSocket=INVALID_SOCKET)%dn,WSAGetLastError(); /初始化效劳器SOCKET地址构造seradd.sin_family=AF_INET; seradd.sin_port=htons(6666); if(bind(sSocket,(LPSOCKADDR)&seradd,sizeof(seradd)=SOCKET_ERROR)地址绑定时出错: int rua; scanf(%d, &rua); ilen=sizeof(cliadd); /初始化接收缓冲区 memset(recv_buf,0,sizeof(recv_buf); irecv
9、=recvfrom(sSocket,recv_buf,buffer_length,0,(struct sockaddr*)&cliadd,&ilen); if(irecv=SOCKET_ERROR)接收出错%dn else if(irecv=0) elsen%s-,recv_buf);Server received from Client ip:%s,port:%dn,inet_ntoa(cliadd.sin_addr),ntohs(cliadd.sin_port); /在此函数中cli为传出参数irecv=recvfrom(sSocket,recv_buf,buffer_length,0,(
10、struct sockaddr*)& if(irecv=SOCKET_ERROR) printf( int rua; return; else %s,send_buf); sendto(sSocket,send_buf,sizeof(send_buf),0,(struct sockaddr*)&cliadd,sizeof(cliadd); closesocket(sSocket);#define data_buffer 1024 SOCKET sclient; /效劳器地址、端口号 int Seriport=6666; char ch=qita /效劳器SOCKET地址构造长度int ilen
11、; /发送/接收数据大小int isend; /要发送给效劳器的数据char send_buf=hello,I am a client. char recv_bufdata_buffer; /效劳器端的SOCKET地址构造struct sockaddr_in seradd, cliadd;memset(recv_buf,0,sizeof(recv_buf); /字符数组初始化memset(ch,0,sizeof(ch);failed to load winsockn / 效劳器SOCKET地址构造初始化 seradd.sin_port=htons(Seriport); cliadd.sin_f
12、amily=AF_INET; cliadd.sin_port=htons(7777); sclient=socket(AF_INET,SOCK_DGRAM,0); if(sclient=INVALID_SOCKET)build socket failed!n if(bind(sclient,(LPSOCKADDR)&cliadd,sizeof(cliadd)=SOCKET_ERROR) /无连接不需要进展地址与套接字的绑定,直接发送数据即可ilen=sizeof(seradd); isend=sendto(sclient,send_buf,sizeof(send_buf),0,(struct
13、sockaddr *)&seradd,ilen); if(isend!=0&isend!=SOCKET_ERROR) /printf(data has been sent successfully!客户所发的数据为:%s, 字节数为:,send_buf,isend); else return;,ch); sendto(sclient,ch,sizeof(ch),0,(struct sockaddr*)&seradd,sizeof(seradd); irecv=recvfrom(sclient,recv_buf,data_buffer,0,(struct sockaddr*)&seradd,&
14、scanf( break;,inet_ntoa(seradd.sin_addr),ntohs(seradd.sin_port); closesocket(sclient);三、实验中出现的问题实验中,因为对TCP和UDP中的代码不熟悉,编译时也缺少了头文件,导致在编译时一直都没有通过,最后在教师的提醒下知道了错误所在,才能编译通过。思考题:问:与本机配置的网络ip地址还有localhost,相互有什么区别?答:localhost 是个域名,不是地址,它可以被配置为任意的 IP 地址,不过通常情况下都指向和 :1(ipv6)整个127.* 网段通常被用作 loopback 网络接口的默认地址,按
15、惯例通常设置为。这个地址在其他计算机上不能访问,就算你想访问,访问的也是自己,因为每台带有TCP/IP协议栈的设备根本上都有。本机地址通常指的是绑定在物理或虚拟网络接口上的IP地址,可供其他设备访问到。四、心得体会在本次试验之前,我对于socket编程并不了解,通过向同学请教以及从网上查找资料,对于这个问题我有了初步的了解,能够进展简单的应用,实现了本机以及联机的TCP协议以及UDP协议通讯。这次实验主要是通过改写代码实现两台计算机之间tcp/udp通信,做起来问题不大,但在代码的理解以及使用上有一定的难度,主要都是通过问同学来解决问题。通过这次实验,明白了计算机是如何进展tcp/udp通信,更加强化了理论知识。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2