一早结束了网络程序设计的实验,小菜一直没空记录一下
今天写点吧
实验要求:
基于UDP的ECHO程序
内容:
所谓echo,就是服务器把它所收到的数据原封不动地回送给客户端。
流程:
1.客户端向服务器发送字符串“Hello world!”;
2.服务器收到后,显示客户端的地址和端口,并把收到的数据回送给客户端;
3.客户端收到回送的数据后显示出来。
要求:
完成UDP的客户、服务器程序;
服务器的固定端口号为20000。
观察并思考:
按如下要求修改代码,观察并回答如下的问题(套接口函数出错时,输出错误代码):
1. 套接口描述符的值是多少?
2. 服务器端如果没有调用bind()函数,会出现什么错误?
3. 客户端的sendto()函数中,如果没有指定正确的远地地址信息结构体的大小会怎样?
4. 服务器端的recvfrom()函数中,最后一个参数没有赋初值会怎样?
5. 如果服务器的接收缓冲区没有使用memset()清空直接接收数据,并以字符串的格式输出收到的数据,屏幕会显示什么?
6. 客户端向服务器发送长度为0的数据,观察服务器的反应。
7. 客户端向服务器发送整数和结构体。结构体如下定义:
struct Stu_T
{
char _name[20];
int _score;
};
8. 如果结构体如下定义,怎么把它的内容发送给服务器?
struct Stu_T
{
char *_name;
int _score;
};
9. 其它您有疑问的地方?
创建一个win32的控制台程序
原理图如下:
效果图
代码分别用两个vc打开 先运行服务器端 再打开客服端
具体代码:
小菜写的东西 里边 很多都是老师复印的教材的结晶
勿喷
//客户端:
#include<stdio.h>
#include<string.h>
#include<Winsock2.h>
#define MAX_BUF 65536
#pragma comment(lib,"ws2_32.lib")
int main()
{
WSAData wsaData;
int err=WSAStartup(WINSOCK_VERSION,&wsaData);
if(0!=err)
{
return -1;
}
SOCKET sock;
sock=socket(AF_INET,SOCK_DGRAM,0);
printf("%d\n",sock);
if(INVALID_SOCKET==sock)
{
printf("socket()Failed:%d\n",WSAGetLastError());
WSACleanup();
return -1;
}
char rbuf[MAX_BUF];
char data[]="Hello World!";
char dest_ip[]="127.0.0.1"; //目的IP
unsigned short dest_port=20000;//目的端口
sockaddr_in RemoteAddr;
RemoteAddr.sin_family = AF_INET;
RemoteAddr.sin_port = htons(dest_port);
RemoteAddr.sin_addr.s_addr=inet_addr(dest_ip);
int sByte = sendto(sock,data,strlen(data),0,(sockaddr*)&RemoteAddr,sizeof(RemoteAddr));
if(SOCKET_ERROR==sByte)
{
printf("sendto()Failed:%d\n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
int RemoteLen = sizeof(RemoteAddr);
printf("%d\n",RemoteLen);
int rByte=recvfrom(sock,rbuf,MAX_BUF,0,(sockaddr*)&RemoteAddr,&RemoteLen);
if(SOCKET_ERROR==rByte)
{
printf("recvfrom()Failed:%d\n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
printf("UDP send[%d]DATA to %s-%d:%s\n",sByte,dest_ip,dest_port,data);
closesocket(sock);
WSACleanup();
return 0;
}
服务器端代码:
服务器:
#include<stdio.h>
#include<string.h>
#include<Winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#define MAX_BUF 65536
int main()
{
WSAData wsaData;
int err=WSAStartup(WINSOCK_VERSION,&wsaData);
if(0!=err)
{
return -1;
}
SOCKET sock;
sock=socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET==sock)
{
printf("socket()Failed:%d\n",WSAGetLastError());
WSACleanup();
return -1;
}
sockaddr_in LocalAddr;
LocalAddr.sin_family=AF_INET;
LocalAddr.sin_port=htons(20000);
LocalAddr.sin_addr.s_addr=htonl(INADDR_ANY);
err=bind(sock,(sockaddr*)&LocalAddr,sizeof(LocalAddr));
if(SOCKET_ERROR==err)
{
printf("bind()Failed:%d\n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
char data[]="Hello World!";
char rbuf[MAX_BUF];
memset(rbuf,0,MAX_BUF);
sockaddr_in RemoteAddr;
int RemoteLen = sizeof(RemoteAddr);
int rByte=recvfrom(sock,rbuf,MAX_BUF,0,(sockaddr*)&RemoteAddr,&RemoteLen);
if(SOCKET_ERROR==rByte)
{
printf("recvfrom()Failed:%d\n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
int sByte = sendto(sock,data,strlen(data),0,(sockaddr*)&RemoteAddr,sizeof(RemoteAddr));
if(SOCKET_ERROR==sByte)
{
printf("sendto()Failed:%d\n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
printf("UDP recv[%d]DATA from %s:%s\n",rByte,inet_ntoa(RemoteAddr.sin_addr),rbuf);
closesocket(sock);
WSACleanup();
return 0;
}