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();
