一早结束了网络程序设计的实验,小菜一直没空记录一下
今天写点吧
内容:
所谓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; }