基于TCP的ECHO程序
自己当场手输的文字 勿喷
内容:
所谓echo,就是服务器把它所收到的数据原封不动地回送给客户端。
流程:
1.客户端向服务器发送字符串“Hello world!”;
2.服务器收到后,显示客户端的地址和端口,并把收到的数据回送给客户端;
3.客户端收到回送的数据后显示出来。
要求:
完成TCP的客户、服务器程序;
服务器的固定端口号为20000。
具体原理不想写了
因为实验报告是手写的 不是电子档
这个老师很特别 大家都这么说
具体代码:
客服端代码:
#pragma comment(lib,"ws2_32.lib") #include<Winsock2.h> #include<stdio.h> #include<string.h> #include<memory.h> int main() { WSAData wsaData; int err=WSAStartup(WINSOCK_VERSION,&wsaData); if(0!=err) { return -1; } SOCKET sock=socket(AF_INET,SOCK_STREAM,0); if(INVALID_SOCKET==sock) { printf("socket()Failed:%d\n",WSAGetLastError()); WSACleanup(); return -1; } sockaddr_in ServerAddr; ServerAddr.sin_family=AF_INET; ServerAddr.sin_port=htons(20000); ServerAddr.sin_addr.s_addr=inet_addr("127.0.0.1"); err=connect(sock,(sockaddr*)&ServerAddr,sizeof(ServerAddr)); printf("%d\n",sock); if(SOCKET_ERROR == err) { printf("connect()Failed:%d\n",WSAGetLastError()); closesocket(sock); WSACleanup(); return -1; } char data[]="Hello World!"; int sByte=send(sock,data,strlen(data),0); if(SOCKET_ERROR==sByte) { printf("send()Failed:%d\n",WSAGetLastError()); closesocket(sock); WSACleanup(); return -1; } shutdown(sock,SD_SEND); char rbuf[1024]; while(1) { memset(rbuf,0,1024); int rByte=recv(sock,rbuf,1024,0); if(SOCKET_ERROR==rByte) { printf("recv()Failed:%\n",WSAGetLastError()); closesocket(sock); WSACleanup(); return -1; } if(0==rByte) { printf("Connection is closed.\n"); break; } printf("TCP recv[%d]DATA:%s\n",rByte,rbuf); } closesocket(sock); WSACleanup(); return 0; }
服务器端代码:
#include <winsock2.h> #include <stdio.h> #include <memory.h> #pragma comment(lib,"ws2_32.lib") int main() { WSAData wsaData; int err = WSAStartup(WINSOCK_VERSION,&wsaData); if(0 != err) { return -1; } SOCKET sock = socket (AF_INET,SOCK_STREAM,0); if(INVALID_SOCKET == sock) { printf("socket() Failed : %d\n",WSAGetLastError()); WSACleanup(); return -1; } sockaddr_in LocaAddr; LocaAddr.sin_family = AF_INET; LocaAddr.sin_port = htons (20000); LocaAddr.sin_addr.s_addr = htonl(INADDR_ANY); err = bind(sock,(sockaddr*)&LocaAddr,sizeof (LocaAddr)); printf("%d\n",sock); if(SOCKET_ERROR == err) { printf("bind() Failed :%d \n",WSAGetLastError); closesocket(sock); return -1; } err = listen(sock,5); if(SOCKET_ERROR == err) { printf("listen() Failed :%d\n",WSAGetLastError); closesocket(sock); WSACleanup(); return -1; } sockaddr_in ClientAddr; int AddrLen = sizeof(ClientAddr); while(1) { SOCKET sockConnected = accept(sock,(sockaddr*)&ClientAddr, &AddrLen); if(INVALID_SOCKET == sockConnected) { printf("accpet() Failed :%d\n",WSAGetLastError); closesocket(sock); WSACleanup(); return -1; } char rbuf[1024]; while(1) { memset(rbuf,0,1024); int rByte = recv(sockConnected,rbuf,1024,0); if(SOCKET_ERROR ==rByte ) { printf("recv() Failed: %d \n",WSAGetLastError); closesocket(sockConnected); break; } if(0 == rByte) { printf("Connection is closed.\n"); shutdown(sockConnected,SD_SEND); closesocket(sockConnected); break; } printf("TCP recv [%d]DATA: %s\n",rByte,rbuf); int sByte = send(sockConnected,rbuf,rByte,0); if(SOCKET_ERROR == sByte) { printf("send()Failed: %d\n",WSAGetLastError()); closesocket(sockConnected); break; } } } closesocket(sock); WSACleanup(); return 0; }
转载请说明出处