因为这学期要交winsocket的通信程序,一个字,坑。因为上课就没有教的。不过有神器在手,陆楠同学的《计算机网络实训和编程》,so,还不是手到擒来!
环境:win7+vs2010
项目:C++项目,有预编译头文件
先看效果:
服务端:
客户端:
连接后:
不过感觉怪怪的。
看看client的源文件:
// TCPEx_Client.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <winsock2.h> #include <iostream> #pragma comment(lib, "ws2_32.lib") using namespace std; int _tmain(int argc, _TCHAR* argv[]) { const int DEFAULT_PORT = 5000; WORD wVersionRequested; WSADATA wsaData; int err,iLen; if (argc < 2) { cout<<"Command:TcpEx_Client ServerIP"<<endl; return 0; } wVersionRequested=MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { cout<<"加载WinSock失败!"; return 0; } SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0); //创建用于连接的套接字 if (sockClient == INVALID_SOCKET) { cout<<"socket() fail:"<<WSAGetLastError()<<endl; return 0; } SOCKADDR_IN addrSrv; addrSrv.sin_family = AF_INET; addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); addrSrv.sin_port = htons(DEFAULT_PORT); err = connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//请求连接服务器进程 if ( err == INVALID_SOCKET ) { cout<<"connect() fail:"<<WSAGetLastError()<<endl; return 0; } char sendBuf[1024],hostname[100]; if (gethostname(hostname,100) != 0) strcpy_s(hostname,"None"); //获取主机名称 strcpy_s(sendBuf,hostname); strcat_s(sendBuf," have conneted to you!"); err = send(sockClient,sendBuf,int(strlen(sendBuf))+1,0); //发送数据 if (err == SOCKET_ERROR) { cout<<"send() fail:"<<WSAGetLastError()<<endl; return 0; } char recvBuf[1024]; iLen = recv(sockClient,recvBuf,1024,0); //接收数据 if (iLen == 0) return 0; else if (iLen == SOCKET_ERROR) { cout<<"recv() fail:"<<WSAGetLastError()<<endl; return 0; } else { recvBuf[iLen] = '\0'; cout<<recvBuf<<endl; } closesocket(sockClient); //关闭套接字 WSACleanup(); }
再看Sever:
// TCPSrvEx.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <winsock2.h> #include <iostream> #include <string.h> using namespace std; #pragma comment(lib, "ws2_32.lib") int _tmain(int argc, _TCHAR* argv[]) { const int DEFAULT_PORT = 5000; WORD wVersionRequested; WSADATA wsaData; int err,iLen; wVersionRequested=MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { cout<<"加载WinSock失败!"; return 0; } SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0); //创建服务器监听套接字 if (sockSrv == INVALID_SOCKET) { cout<<"socket() fail:"<<WSAGetLastError()<<endl; return 0; } SOCKADDR_IN addrSrv; addrSrv.sin_family = AF_INET; addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//自动分配地址,字节顺序转换 addrSrv.sin_port = htons(DEFAULT_PORT);//字节顺序转换 err = bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //绑定本地主机IP和端口 if ( err != 0 ) { cout<<"bind() fail:"<<WSAGetLastError()<<endl; return 0; } err = listen(sockSrv,5); //监听 if ( err != 0 ) { cout<<"listen() fail:"<<WSAGetLastError()<<endl; return 0; } cout<<"Server waiting...:"<<endl; SOCKADDR_IN addrClient; int len = sizeof(SOCKADDR); while(1) { SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);//接收客户连接请求 if (sockConn == INVALID_SOCKET) { cout<<"accept() fail:"<<WSAGetLastError()<<endl; break; } char sendBuf[1024],hostname[100]; if (gethostname(hostname,100) != 0) //获取主机名称 strcpy_s(hostname,"None"); sprintf_s(sendBuf,"welcome %s connected to %s!",inet_ntoa(addrClient.sin_addr),hostname); err = send(sockConn,sendBuf,int(strlen(sendBuf))+1,0); //发送数据 if (err == SOCKET_ERROR) { cout<<"send() fail:"<<WSAGetLastError()<<endl; break; } char recvBuf[1024] = "\0"; iLen = recv(sockConn,recvBuf,1024,0);//接收数据 if (iLen == SOCKET_ERROR) { cout<<"recv() fail:"<<WSAGetLastError()<<endl; break; } recvBuf[iLen] = '\0'; cout<<recvBuf<<endl; closesocket(sockConn); //关闭套接字 } closesocket(sockSrv);//关闭服务器监听套接字 WSACleanup(); return 0; }
好吧,其实我只是把书本上的例子实现了一遍。
看看老师给的例子:
client:
// Client.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<WINSOCK2.H> #include<iostream.h> #include <stdio.h> #pragma comment(lib,"ws2_32.lib") void main(int argc, char* argv[]) { SOCKET sock ; SOCKADDR_IN dest_sin ; WSADATA wsaData ;//版本参数 int port = 344 ; if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) { cout<<"WinSock startup Error!" ; return ; } sock = socket(AF_INET, SOCK_STREAM, 0) ; if (sock == INVALID_SOCKET) { cout<<"socket() failed" ; closesocket(sock) ; return ; } dest_sin.sin_family = AF_INET ; dest_sin.sin_port = htons(port) ; dest_sin.sin_addr.s_addr = inet_addr("127.0.0.1") ; connect(sock, (sockaddr *)&dest_sin, sizeof(dest_sin)) ; ////连续发十个数给服务器 char szName[20] ; for(int i=0 ; i<20 ; i++) { sprintf(szName, " %d", i) ; send(sock, szName, 20, 0) ; } // send(sock, " ",0,0) ; closesocket(sock) ; if (WSACleanup() == SOCKET_ERROR) { cout<<"WSACleanup() failed with error "<<WSAGetLastError() ; } }
Sever:
// Server.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<WINSOCK2.H> #include<iostream.h> #pragma comment(lib,"ws2_32.lib") void main(int argc, char* argv[]) { SOCKET sockServer ; SOCKET sockAccept ; SOCKADDR_IN local_sin ; SOCKADDR_IN acc_sin ; WSADATA wsaData ; int port = 344 ; if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) { cout<<"WinSock startup Error!" ; return ; } sockServer = socket(AF_INET, SOCK_STREAM, 0) ; if (sockServer == INVALID_SOCKET) { cout<<"socket() failed" ; closesocket(sockServer) ; return ; } local_sin.sin_port = htons(port) ; local_sin.sin_family = AF_INET ; local_sin.sin_addr.s_addr = INADDR_ANY ; if (bind(sockServer, (sockaddr FAR*)&local_sin, sizeof(local_sin)) == SOCKET_ERROR) { cout<<"bind(sock) failed "<<WSAGetLastError()<<"is the error!" ; return ; } cout<<"Server begin..."<<endl ; if (listen(sockServer, 4)) { cout<<"listen(sockserver) failed "<<WSAGetLastError()<<" is the error!" ; return ; } int acc_sin_len = sizeof(acc_sin) ; sockAccept = accept(sockServer, (sockaddr FAR*)&acc_sin, (int FAR*)&acc_sin_len) ; if (sockAccept<0) { cout<<"accept() failed "<<WSAGetLastError()<<" is the error!" ; return ; } char szName[20] ; ////////////////////////////////////////////////////////////////////////// //等待接收数据 while (1) { int rec = recv(sockAccept, szName, 20, 0) ; if( rec == 0) { cout<<"Server stop.."<<endl ; break ; } else cout<<szName<<endl ; } closesocket(sockServer) ; closesocket(sockAccept) ; if (WSACleanup() == SOCKET_ERROR) { cout<<"WSACleanup() failed with error "<<WSAGetLastError() ; } }
相关推荐
基于C/S结构的VC++网络考试管理系统,使用Access存储有关数据,程序分为客户端和服务端。 服务端采用WinSocket32完成端口模型,使用了WIN32多线程技术以及ODBC APIS 进行数据库操作; 客户端使用Win32 API函数...
客户端/服务器(Client/Server,简称C/S)架构是一种经典的分布式计算模型,广泛应用于各种IT系统和网络服务中。在C/S模式下,客户端作为用户界面,与用户交互,发送请求给服务器,而服务器则负责处理这些请求,返回...
客户机/服务器(Client/Server,C/S)模型是网络通信中最常见的架构。在这个模型中,服务器提供服务,而客户端请求并使用这些服务。服务器通常持续运行,等待客户端的连接,而客户端则发起连接请求,发送数据,接收...
综上所述,"TCP通信-使用winsocket"示例涵盖了网络编程的核心概念,包括TCP协议、Winsock API、多线程、阻塞模式的select模型以及C/S架构。同时,也提示我们在实际开发中需要注意对并发连接管理和通信效率的优化。
重叠I/O模型是Winsocket中最先进的I/O模型之一,允许应用程序同时对多个套接字执行输入输出操作,并且无需等待这些操作完成即可返回。这种非阻塞式的I/O操作提高了系统的响应速度和吞吐量。 ##### 2. 重叠I/O模型中...
2. **C/S模式**:客户端/服务器(Client-Server)模式是网络架构的基础,其中服务器提供服务,客户端请求并接收这些服务。在这个项目中,"Dlg_Svr"可能代表服务器端的对话框类,负责监听客户端连接和处理数据交换;...
在Windows开发环境下,Visual C++ 6.0版本提供了封装良好的`CSocket`类,为编写Internet环境下基于Windows平台的C/S程序提供了极大的便利。 #### 二、WinSocket简介 **WinSocket**,可以理解为网络通信的一个端点...
Select模型适合于小型应用程序,而WSAAsyncSelect、WSAEventSelect等模型则更适合于需要更细粒度控制的应用程序。Overlapped I/O和IOCP模型则是为高性能网络应用设计的,它们能够在高负载下提供出色的性能表现。理解...
3. **应用开发工具的熟悉与掌握**:包括但不限于开发环境的搭建、调试工具的使用等,以便于在网络应用程序的开发过程中提高效率。 4. **网络设备的学习与组网技术的掌握**:这包括路由器、交换机等硬件设备的功能与...