C++基于TCP/IP简单的客户端、服务器通信程序实例
2018-03-12 13:12
876 查看
本篇文章实现了一个基于TCP 的一个非常简单的客户/服务器通信程序实例。该程序中通讯协议使用的是面向连接的TCP协议SOCK_STREAM, 服务器的ip地址为本地地址即:
127.0.0.1,端口号为自定义的5099(大于1024即可),
服务端的功能:只要有客户端连接请求,服务端就接受连接,在连接成功后向客户端发送数据,并且接受客户端发送的数据(只发送一次)。
客户端:向服务端发出请求后接受并显示服务端的数据,并且给服务端也发送数据。(只发送一次)
以下代码是服务端程序代码:
接下来是客户端代码:
这是初始版本,接下来是实现一问一答的聊天模式版本
服务端代码:
以下是客户端:
127.0.0.1,端口号为自定义的5099(大于1024即可),
服务端的功能:只要有客户端连接请求,服务端就接受连接,在连接成功后向客户端发送数据,并且接受客户端发送的数据(只发送一次)。
客户端:向服务端发出请求后接受并显示服务端的数据,并且给服务端也发送数据。(只发送一次)
以下代码是服务端程序代码:
#include <WinSock2.h> #include <stdio.h> #include <stdlib.h> #pragma comment(lib, "ws2_32.lib") void main() { WSADATA wsaData; int port = 5099; char buf[] = "Server: hello, I am a server....."; if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("Failed to load Winsock"); return; } //创建用于监听的套接字 SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrSrv; addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(port); //1024以上的端口号 addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); int retVal = bind(sockSrv, (LPSOCKADDR)&addrSrv, sizeof(SOCKADDR_IN)); if(retVal == SOCKET_ERROR){ printf("Failed bind:%d\n", WSAGetLastError()); return; } if(listen(sockSrv,10) ==SOCKET_ERROR){ printf("Listen failed:%d", WSAGetLastError()); return; } SOCKADDR_IN addrClient; int len = sizeof(SOCKADDR); while(1) { //等待客户请求到来 SOCKET sockConn = accept(sockSr 4000 v, (SOCKADDR *) &addrClient, &len); if(sockConn == SOCKET_ERROR){ printf("Accept failed:%d", WSAGetLastError()); break; } printf("Accept client IP:[%s]\n", inet_ntoa(addrClient.sin_addr)); //发送数据 int iSend = send(sockConn, buf, sizeof(buf) , 0); if(iSend == SOCKET_ERROR){ printf("send failed"); break; } char recvBuf[100]; memset(recvBuf, 0, sizeof(recvBuf)); // //接收数据 recv(sockConn, recvBuf, sizeof(recvBuf), 0); printf("%s\n", recvBuf); closesocket(sockConn); } closesocket(sockSrv); WSACleanup(); system("pause"); }
接下来是客户端代码:
#include <WinSock2.h> #include <stdio.h> #pragma comment(lib, "ws2_32.lib") void main() { //加载套接字 WSADATA wsaData; char buff[1024]; memset(buff, 0, sizeof(buff)); if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("Failed to load Winsock"); return; } SOCKADDR_IN addrSrv; addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(5099); addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //创建套接字 SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0); if(SOCKET_ERROR == sockClient){ printf("Socket() error:%d", WSAGetLastError()); return; } //向服务器发出连接请求 if(connect(sockClient, (struct sockaddr*)&addrSrv, sizeof(addrSrv)) == INVALID_SOCKET){ printf("Connect failed:%d", WSAGetLastError()); return; }else { //接收数据 recv(sockClient, buff, sizeof(buff), 0); printf("%s\n", buff); } //发送数据 char buff = "hello, this is a Client...."; send(sockClient, buff, sizeof(buff), 0); //关闭套接字 closesocket(sockClient); WSACleanup(); }
这是初始版本,接下来是实现一问一答的聊天模式版本
服务端代码:
#include <WinSock2.h> #include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; #pragma comment(lib, "ws2_32.lib") void main() { WSADATA wsaData; int port = 5099; char buf[] = "Server: hello, I am a server....."; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("Failed to load Winsock"); return; } //创建用于监听的套接字 SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrSrv; addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(port); //1024以上的端口号 addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); int retVal = bind(sockSrv, (LPSOCKADDR)&addrSrv, sizeof(SOCKADDR_IN)); if (retVal == SOCKET_ERROR) { printf("Failed bind:%d\n", WSAGetLastError()); return; } if (listen(sockSrv, 10) == SOCKET_ERROR) { printf("Listen failed:%d", WSAGetLastError()); return; } SOCKADDR_IN addrClient; int len = sizeof(SOCKADDR); //等待客户请求到来 SOCKET sockConn = accept(sockSrv, (SOCKADDR *)&addrClient, &len); if (sockConn == SOCKET_ERROR) { printf("Accept failed:%d", WSAGetLastError()); //break; } printf("Accept client IP:[%s]\n", inet_ntoa(addrClient.sin_addr)); int iSend = send(sockConn, buf, sizeof(buf), 0); if (iSend == SOCKET_ERROR) { printf("send failed"); //break; } while (1) { char recvBuf[100]; memset(recvBuf, 0, sizeof(recvBuf)); //接收数据 recv(sockConn, recvBuf, sizeof(recvBuf), 0); cout << "收到的信息: "; cout << recvBuf << endl; //发送数据 cout << "请输入发送的信息: " ; char sendBuf[100]; memset(sendBuf, 0, sizeof(sendBuf)); cin.getline(sendBuf,sizeof(sendBuf)); iSend = send(sockConn, sendBuf, sizeof(sendBuf), 0); if (iSend == SOCKET_ERROR) { printf("send failed"); break; } if (sendBuf[0] == 'e') //关闭套接字 { closesocket(sockConn); cout << "关闭接受套接字" << endl; break; } } closesocket(sockSrv); WSACleanup(); system("pause"); }
以下是客户端:
#include <WinSock2.h> #include <stdio.h> #include <iostream> using namespace std; #pragma comment(lib, "ws2_32.lib") void main() { //加载套接字 WSADATA wsaData; char buff[1024]; memset(buff, 0, sizeof(buff)); if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("Failed to load Winsock"); return; } SOCKADDR_IN addrSrv; addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(5099); addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //创建套接字 SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0); if (SOCKET_ERROR == sockClient) { printf("Socket() error:%d", WSAGetLastError()); return; } //向服务器发出连接请求 if (connect(sockClient, (struct sockaddr*)&addrSrv, sizeof(addrSrv)) == INVALID_SOCKET) { printf("Connect failed:%d", WSAGetLastError()); return; } // else while(1) { //接收数据 recv(sockClient, buff, sizeof(buff), 0); cout << "收到的信息: "; cout << buff << endl; //发送数据 //char buff1[] = "hello, this is a Client...."; cout << "请输入发送的信息: " ; char sendBuf[100]; memset(sendBuf, 0, sizeof(sendBuf)); cin.getline(sendBuf,sizeof(sendBuf)); cout << "sizeof(sendBuf):" << sizeof(sendBuf) << endl; send(sockClient, sendBuf, sizeof(sendBuf), 0); if (sendBuf[0] == 'e') { //关闭套接字 closesocket(sockClient); cout << "关闭client套接字" << endl; break; } } WSACleanup(); system("puase"); }
相关文章推荐
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- Linux基于TCP/IP简单的客户端、服务器通信程序实例
- Linux基于TCP/IP简单的客户端、服务器通信程序实例
- 一个简单的基于node.js的TCP服务器和基于C++的TCP客户端通信示例程序
- TCP/IP通信 客户端、服务器 实例
- 基于TCP网络通信的自动升级程序源码分析-客户端请求服务器上的升级信息
- Qt网络程序:基于TCP的服务器、客户端实例
- 基于TCP网络通信的自动升级程序源码分析-客户端请求服务器上的升级信息
- 基于TCP网络通信的自动升级程序源码分析-客户端连接服务器
- C++基于socket的单线程服务器客户端聊天程序(TCP)
- 基于TCP网络通信的自动升级程序源码分析-客户端连接服务器