C++ TCP Server

本文介绍如何使用C++和Winsock2库创建一个简单的TCP服务器。主要内容包括:配置VC++2005环境以支持网络编程,初始化Winsock,创建并绑定套接字,监听连接请求,以及与客户端进行数据交互。


C++ TCP Server

用C++写网络程序需要winsock2.h这个头文件,还有添加一个ws2_32.lib的lib库.


VC++2005添加Lib库的方法
1 项目- Server属性- 配置属性- 连接器- 附加依赖项
2 #pragma  comment(lib,"ws2_32.lib")
3 查找ws2_32.lib文件项目- 添加现有项,将ws2_32.lib作为文件添加到项目中去

为了简单化,暂不进行错误处理
在创建sock之前先要初始化
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);
创建套接字
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);

AF_INET是address family internet的缩写
SOCKADDR_IN addrSrv;
SOCKADDR_IN结构包括地址簇,端口号,IP地址,填充位
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
INADDR_ANY表示不限制连接IP
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(1986);
创建TCP程序的步骤
bind(sockSrv,(SOCKADDR *) &addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);

htonl 是host to network long的缩写

一直等待客户端发送消息
while(true)
 { SOCKET sockConn = accept(sockSrv,(SOCKADDR *)&addrClient,&len);
  char sendBuf[100]="服务端发送给客户端";
  std::cout<<sendBuf<<endl;  
  send(sockConn,sendBuf,strlen(sendBuf)+1,0);
  char recvBuf[100];
  recv(sockConn,recvBuf,100,0);  
  std::cout<<recvBuf<<endl;
  closesocket(sockConn);
 }

sendBuf是发送给客户端的数据
recvBuf是接受的到的数据
完成源码
#include <Winsock2.h>
#include <iostream>.
#pragma  comment(lib,"ws2_32.lib")
using namespace std;
int main()
{
 WSADATA wsaData;
 WSAStartup(MAKEWORD(2,2),&wsaData);
 SOCKET sockSrv = socket(AF_INET, SOCK_STREAM,  0); 
    SOCKADDR_IN addrSrv;  
 addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    addrSrv.sin_family = AF_INET;
 addrSrv.sin_port = htons(1986);
 cout<<htons(1986);
    bind(sockSrv,(SOCKADDR *) &addrSrv,sizeof(SOCKADDR));
    listen(sockSrv,5);
 SOCKADDR_IN addrClient;
 int len = sizeof(SOCKADDR);
 while(true)
 {
 SOCKET sockConn = accept(sockSrv,
 (SOCKADDR *) &addrClient,&len);
 char sendBuf[100]="服务端发送给客户端";
    std::cout<<sendBuf<<endl;
    send(sockConn,sendBuf,strlen(sendBuf)+1,0);
 char recvBuf[100];
 recv(sockConn,recvBuf,100,0);
    std::cout<<recvBuf<<endl;
 closesocket(sockConn);
 }
 return 0;
}
在VC++2005下调试通过


原文:http://blog.youkuaiyun.com/flyfish1986/article/details/3240814

C++实现TCP服务器有多种方式,下面分别介绍简单的TCP服务器实现和使用`libuv`实现高性能TCP服务器的相关内容。 ### 简单的TCP服务器实现 要实现简单的TCP服务器,需确保开发环境中安装了C++编译器(如GCC或Clang)以及支持的标准库,在Linux或类Unix系统上开发较为常见。以下是简单的实现思路及示例代码: ```cpp #include <iostream> #include <cstring> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #define PORT 8080 int main() { int server_fd, new_socket; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); char buffer[1024] = {0}; const char *hello = "Hello from server"; // 创建socket文件描述符 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 设置socket选项 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // 绑定socket到指定地址和端口 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } // 监听连接 if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } // 接受连接 if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) { perror("accept"); exit(EXIT_FAILURE); } // 读取客户端发送的数据 int valread = read(new_socket, buffer, 1024); std::cout << buffer << std::endl; // 发送响应给客户端 send(new_socket, hello, strlen(hello), 0); std::cout << "Hello message sent" << std::endl; // 关闭连接 close(new_socket); close(server_fd); return 0; } ``` 此代码创建了一个简单的TCP服务器,监听指定端口,接受客户端连接,读取客户端发送的数据并发送响应。 ### 使用`libuv`实现高性能TCP服务器 `libuv`可用于构建高性能的TCP服务器,并能解决数据流中的粘包与拆包问题。不过引用中未给出具体代码,若使用`libuv`实现,大致步骤如下: 1. 初始化`libuv`库。 2. 创建TCP服务器句柄。 3. 绑定服务器到指定地址和端口。 4. 开始监听连接。 5. 处理客户端连接和数据收发。 ### 并发处理 TCP服务端通常需要为每个客户端连接创建一个线程或使用非阻塞I/O来处理并发。若需要处理大量并发客户端,可以考虑使用线程池或非阻塞I/O [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值