Socket编程报告(TCP/IP协议)
一.实验目的
通过C++来实现TCP/IP协议下的Socket编程,掌握TCP协议的算法实现。
二.实验原理
客户端 建立Socket,通过端口号和地址确定目标服务器,使用Connect连接到服务器,send发送消息,等待处理,通信完成后调用CloseSocket关闭Socket
服务端 建立Socket,声明自身的端口号和地址并绑定到Socket,使用Listen打开监听,然后不断用Accept去查看是否有连接,如果有,捕获Socket,并通过Recv获取消息的内容,通信完成后调用CloseSocket关闭这个对应Accept到的Socket,如果不再需要等待任何客户端连接,那么用CloseSocket关闭掉自身的Socket
三.实验代码(C++实现)
服务器端代码如下:
#pragma once #include
#pragma comment (lib,\class CServerNet { public:
//初始化服务器,返回0表示成功
int Init(const char* address,int port);
//更新数据
void Run();
private: };
int CServerNet::Init( const char* address,int port ) {
int rlt = 0; SOCKET m_sock;
//用于记录错误信息,并输出
int iErrorMsg;
//初始化WinSock
if (iErrorMsg != NO_ERROR) {
WSAData wsaData;
iErrorMsg = WSAStartup(MAKEWORD(1,1),&wsaData);
//初始化WinSock失败
printf(\
rlt = 1;
//创建服务端Socket
m_sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if (m_sock == INVALID_SOCKET) }
return rlt;
{
//创建Socket异常
printf(\
rlt = 2;
//绑定
iErrorMsg = bind(m_sock,(sockaddr*)&serverAddr,sizeof(serverAddr)); if (iErrorMsg < 0) { }
//绑定失败
printf(\rlt = 3; return rlt; //声明信息
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET; serverAddr.sin_port = port;
serverAddr.sin_addr.s_addr = inet_addr(address); }
return rlt;
return rlt; }
void CServerNet::Run() {
sockaddr_in tcpAddr; int len = sizeof(sockaddr); SOCKET newSocket; char buf[1024]; int rval; //公开连接 listen(m_sock,5);
do {
//接收信息
newSocket = accept(m_sock,(sockaddr*)&tcpAddr,&len);
if (newSocket == INVALID_SOCKET)
{
//非可用socket
} else
{
//新socket连接
printf(\ //消息处理
if (rval == 0)
}
//关闭对应Accept的socket closesocket(newSocket);
}while(rval != 0);
else
//显示接收到的数据 printf(\//recv返回0表示正常退出 printf(\
if (rval == SOCKET_ERROR)
//这应该是个异常,当客户端没有调用closeSocket就直接退出游戏的时候,将会进入这里 printf(\
do {
printf(\//接收数据
memset(buf,0,sizeof(buf)); rval = recv(newSocket,buf,1024,0);
} while (1); }
//关闭自身的Socket closesocket(m_sock);
int main(int argc, char **argv) {
CServerNet serverNet;
int iRlt = serverNet.Init(\if (iRlt == 0) {
}
} else
printf(\serverNet.Run();
printf(\
system(\
客户端代码如下:
#pragma once #include
#pragma comment(lib, \class CClientNet { public: private: };
int CClientNet::Connect( int port,const char* address ) {
//用于记录错误信息并输出 int iErrMsg; //启动WinSock WSAData wsaData;
iErrMsg = WSAStartup(MAKEWORD(1,1),&wsaData); if (iErrMsg != NO_ERROR) {
printf(\//有错误 int rlt = 0; SOCKET m_sock; //连接上指定服务器
int Connect(int port,const char* address); //发送信息
int SendMsg(const char* msg,int len); //关闭 void Close();