Tcp socket 收发数据流程图
服务器端代码:
WORD wVersionRequested;
WSADATA wsaData;
int err;
char recvbuffer[100],recvdata[100];
//time_t time_start,time_end;
cout<<"This is server!"<<endl;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0)
{
return;
}
if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)
{
//终止对WINSOCKET库的使用
WSACleanup();
return;
}
//addrServer代表服务器端地址和端口
SOCKADDR_IN addrServer;
addrServer.sin_family=AF_INET;
addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrServer.sin_port=htons(SERVER_PORT);
//创建Socket
int sockServer=socket(AF_INET,SOCK_STREAM,0);
if(sockServer<0)
{
cout<<"Socket created failed."<<endl;
return;
}
if(bind(sockServer,(struct sockaddr*)&addrServer,sizeof(addrServer))<0)
{
cout<<"Bind failed"<<endl;
return ;
}
if(listen(sockServer,5)<0)
{
cout<<"Listen failed"<<endl;
return ;
}
SOCKADDR_IN addrClient;
int length = sizeof(addrClient);
int new_socket = accept(sockServer,(struct sockaddr*)&addrClient,&length);
//get remote port
int remotePort = ntohs(addrClient.sin_port);
//get remote address
char* remoteAddress = inet_ntoa(addrClient.sin_addr);
cout<<"remote port is:"<<remotePort<<endl;
cout<<"remoteAddress is:"<<remoteAddress<<endl;
if(new_socket<0)
{
cout<<"Accept failed!"<<endl;
return;
}
memset(recvbuffer,0,sizeof(recvbuffer));
memset(recvdata,0,sizeof(recvdata));
memcpy(recvbuffer,"Hello!",100);
//发送数据
int leng = send(new_socket,(const char*)recvbuffer,DATA_LEN,0);
int len = recv(new_socket, (char *)recvdata, DATA_LEN, 0);
cout<<"Recieve data :"<<recvdata<<endl;
if( len < 0)
{
cout<<"receive data failed!"<<endl;
return;
}
closesocket(new_socket);
closesocket(sockServer);
WSACleanup();
//
//客户端代码
WORD wVersionRequested;
WSADATA wsaData;
int err;
char recvbuffer[100],recvdata[100];
//select监视的可读文件句柄集合
//fd_set readfd;
//time_t time_start,time_end;
cout<<"This is client!"<<endl;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0)
{
return;
}
if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)
{
//终止对WINSOCKET库的使用
WSACleanup();
return;
}
//addrClient代表客户端地址和端口
SOCKADDR_IN addrClient;
addrClient.sin_family=AF_INET;
addrClient.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrClient.sin_port=htons(0);
//创建TCPSocket
int sockClient = socket(AF_INET,SOCK_STREAM,0);
if(sockClient<0)
{
cout<<"Socket created failed."<<endl;
return;
}
if(bind(sockClient,(struct sockaddr*)&addrClient,sizeof(addrClient))<0)
{
cout<<"Bind failed"<<endl;
return ;
}
SOCKADDR_IN addrServer;
addrServer.sin_family=AF_INET;
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//服务器端IP地址
addrServer.sin_port=htons(5000);//服务器端监听端口
if(connect(sockClient,(struct sockaddr*)&addrServer,sizeof(addrServer))<0)
{
//connect error
return ;
}
memset(recvbuffer,0,sizeof(recvbuffer));
memset(recvdata,0,sizeof(recvdata));
int len = recv(sockClient, (char *)recvdata, DATA_LEN, 0);
cout<<"Recieve data :"<<recvdata<<endl;
if( len < 0)
{
cout<<"receive data failed!"<<endl;
return;
}
memcpy(recvbuffer,"OK!",100);
//发送数据
int leng = send(sockClient,(const char*)recvbuffer,DATA_LEN,0);
cout<<"Send Ok to server: "<<recvbuffer<<endl;
WSACleanup();