网络编程基础(一)——使用TCP

  网络编程中最基本的是TCP/UDP协议,而目前比较流行的是使用已经非常成熟socket库来处理。

 

  下面举例说明:

首先必须在使用socket的地方包含库,这里使用微软封装好的winsocket库:

#include <winsock2.h> #pragma comment(lib, "WS2_32.lib") 

客户端代码:

int TCPSocket::TCPSocketClient() { #pragma region 初始化套接字 WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(1, 1), &wsaData); //版本1.1 if (NO_ERROR != iResult) { AfxMessageBox(_T("Error at WSAStartup()/n")); return -1; } if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); return -1; }//如果不是1.1的则退出 #pragma endregion 初始化套接字 #pragma region 创建套接字 //---------------------- // Create a SOCKET for listening for incoming connection requests SOCKET socketClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALID_SOCKET == socketClient) { //cout<<"Error at socket():/n"<< WSAGetLastError(); AfxMessageBox(_T("Error at socket():/n")); WSACleanup(); return -1; } #pragma endregion 创建套接字 #pragma region 请求服务器 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(8086); int err; /************************************************************************/ /* 连接服务器 */ /************************************************************************/ err = connect(socketClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//向服务器发出连接请求(connect)。 if (SOCKET_ERROR == err) { //cout<<"Error at Connect():/n"<< WSAGetLastError(); AfxMessageBox(_T("Error at Connect():/n")); closesocket(socketClient); WSACleanup(); return -1; } #pragma endregion 请求服务器 #pragma region 接受数据 /************************************************************************/ /* 接受数据 */ /************************************************************************/ char recvBuf[100];//和服务器端进行通信(send/recv)。 err = recv(socketClient, recvBuf, 100,0); if (SOCKET_ERROR == err) { //cout<<"Error at Recv from Service:/n"<< WSAGetLastError(); AfxMessageBox(_T("Error at Recv from Service:/n")); closesocket(socketClient); WSACleanup(); return -1; } //printf("%s/n",recvBuf); #pragma endregion 接受数据 #pragma region 发送数据 /************************************************************************/ /* 发送数据 */ /************************************************************************/ err = send(socketClient,"This is Client", strlen("This is Client")+1, 0); if (SOCKET_ERROR == err) { //cout<<"Error at Send to Service:/n"<< WSAGetLastError(); AfxMessageBox(_T("Error at Send to Service:/n")); closesocket(socketClient); WSACleanup(); return -1; } #pragma endregion 发送数据 closesocket(socketClient); WSACleanup(); return 1; } 

服务器端代码:

int TCPSocket::TCPSocketServer() { #pragma region 初始化套接字库 WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(1, 1), &wsaData); //版本1.1 if (NO_ERROR != iResult) { //cout<<"Error at WSAStartup()/n"; AfxMessageBox(_T("Error at WSAStartup()/n")); return -1; } if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); return -1; }//如果不是1.1的则退出 #pragma endregion 初始化套接字库 #pragma region 创建套接字 //---------------------- // Create a SOCKET for listening for incoming connection requests SOCKET socketSrv = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALID_SOCKET == socketSrv) { //cout<<"Error at socket():/n"<< WSAGetLastError(); AfxMessageBox(_T("Error at socket():/n")); WSACleanup(); return -1; } #pragma endregion 创建套接字 #pragma region 绑定套接字 // The sockaddr_in structure specifies the address family, // IP address, and port for the socket that is being bound. sockaddr_in addrSrv; addrSrv.sin_family = AF_INET; addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); addrSrv.sin_port = htons(8086); int err; /************************************************************************/ /* 绑定套接字 */ /************************************************************************/ err = bind(socketSrv, (sockaddr*)&addrSrv, sizeof(addrSrv)); if (SOCKET_ERROR == err) { //cout<<"Error at Bind!/n"<< WSAGetLastError(); AfxMessageBox(_T("Error at Bind!/n")); closesocket(socketSrv); WSACleanup(); return -1; } #pragma endregion 绑定套接字 #pragma region 监听套接字 /************************************************************************/ /*监听套接字 */ /************************************************************************/ err = listen(socketSrv, SOMAXCONN); if (SOCKET_ERROR == err) { //cout<<"Error at Listen!/n"<< WSAGetLastError(); AfxMessageBox(_T("Error at Listen!/n")); closesocket(socketSrv); WSACleanup(); return -1; } #pragma endregion 监听套接字 #pragma region 持续接受从客户端来的消息 /************************************************************************/ /* 接受数据 */ /************************************************************************/ sockaddr_in addrClient;//定义地址族 int len = sizeof(sockaddr);//初始化这个参数,这个参数必须被初始化 while (1) { SOCKET sockAccept = accept(socketSrv, (sockaddr*) &addrClient, &len); if (INVALID_SOCKET == sockAccept) { //cout<<"Error at accept!/n"<< WSAGetLastError(); AfxMessageBox(_T("Error at accept!/n")); } char sendBuf[100]; sprintf_s(sendBuf, 100, "Welcome %s to This Service!", inet_ntoa(addrClient.sin_addr)); /************************************************************************/ /* 发送数据 */ /************************************************************************/ err = send(sockAccept, sendBuf, strlen(sendBuf)+1, 0); if (SOCKET_ERROR == err) { //cout<<"Error at Send to Client!/n"<< WSAGetLastError(); AfxMessageBox(_T("Error at Send to Client!/n")); } /************************************************************************/ /* 接受数据 */ /************************************************************************/ char recvBuf[100]; err = recv(sockAccept, recvBuf, 100, 0); if (SOCKET_ERROR == err) { //cout<<"Error at Recv from Client!/n"<< WSAGetLastError(); AfxMessageBox(_T("Error at Recv from Client!/n")); } //printf("%s/n",recvBuf); CString str; str.Format(_T("s%"), recvBuf); AfxMessageBox(str); closesocket(sockAccept);//关闭套接字。等待另一个用户请求 } #pragma endregion 持续接受从客户端来的消息 closesocket(socketSrv); WSACleanup(); return 1; } 

 

代码比较基本,也比较简单,没有复杂功能。测试环境SP3+VS2008

 

你可能感兴趣的:(编程,tcp,网络,socket,service,服务器)