TCP服务器/客户端代码示例
TCP服务器代码:
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <iostream> using namespace std; int main(int argc, char *argv[])
{
if (argc != )
{
cout << "usage: " << argv[] << " ip port" << endl;
return -;
} char *szIp = argv[];
in_addr_t iIp = inet_addr(szIp);
if (iIp == INADDR_NONE)
{
cerr << "fail to parse ip: " << szIp << endl;
return -;
}
char *pEnd = NULL;
uint16_t usPort = strtoul(argv[], &pEnd, );
if (*pEnd != '\0')
{
cerr << "fail to parse port: " << argv[] << endl;
return -;
} int iSockFd = socket(AF_INET, SOCK_STREAM, );
if (iSockFd < )
{
cerr << "fail to create socket, err: " << strerror(errno) << endl;
return -;
}
cout << "create socket fd " << iSockFd << endl; sockaddr_in oAddr;
memset(&oAddr, , sizeof(oAddr));
oAddr.sin_family = AF_INET;
oAddr.sin_addr.s_addr = iIp;
oAddr.sin_port = htons(usPort);
if (bind(iSockFd, (sockaddr *)&oAddr, sizeof(oAddr)) < )
{
cerr << "fail to bind addr " << szIp << ":" << usPort << ", err: " << strerror(errno) << endl;
return -;
}
cout << "bind addr " << szIp << ":" << usPort << endl; if (listen(iSockFd, ) < )
{
cerr << "fail to listen on " << szIp << ":" << usPort << ", err: " << strerror(errno) << endl;
}
cout << "listen on socket fd " << iSockFd << endl; uint8_t acRecvBuf[ * ];
while (true)
{
sockaddr_in oClientAddr;
socklen_t iAddrLen = sizeof(oClientAddr);
int iAcceptFd = accept(iSockFd, (sockaddr *)&oClientAddr, &iAddrLen);
if (iAcceptFd < )
{
cerr << "fail to accpet, err: " << strerror(errno) << endl;
continue;
}
cout << "recv connection from " << inet_ntoa(oClientAddr.sin_addr) << ":" << ntohs(oClientAddr.sin_port) << endl; while (true)
{
ssize_t iRecvLen = recv(iAcceptFd, acRecvBuf, sizeof(acRecvBuf), );
if (iRecvLen < )
{
cerr << "fail to recv, close connection, err: " << strerror(errno) << endl;
close(iAcceptFd);
break;
}
if (iRecvLen == )
{
cout << "connection closed by client" << endl;
close(iAcceptFd);
break;
}
cout << "recv data len: " << iRecvLen << endl; ssize_t iSendLen = send(iAcceptFd, acRecvBuf, iRecvLen, );
if (iSendLen < )
{
cerr << "fail to send, err: " << strerror(errno) << endl;
close(iAcceptFd);
break;
}
cout << "echo to client, len: " << iSendLen << endl;
} }
}
TCP客户端代码:
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <iostream> using namespace std; int main(int argc, char *argv[])
{
if (argc != )
{
cout << "usage: " << argv[] << " ip port message" << endl;
return -;
} char *szIp = argv[];
in_addr_t iIp = inet_addr(szIp);
if (iIp == INADDR_NONE)
{
cerr << "fail to parse ip: " << szIp << endl;
return -;
}
char *pEnd = NULL;
uint16_t usPort = strtoul(argv[], &pEnd, );
if (*pEnd != '\0')
{
cerr << "fail to parse port: " << argv[] << endl;
return -;
}
char *szMsg = argv[];
size_t uiMsgLen = strlen(szMsg); int iSockFd = socket(AF_INET, SOCK_STREAM, );
if (iSockFd < )
{
cerr << "fail to create socket, err: " << strerror(errno) << endl;
return -;
}
cout << "create socket fd " << iSockFd << endl; sockaddr_in oServerAddr;
memset(&oServerAddr, , sizeof(oServerAddr));
oServerAddr.sin_family = AF_INET;
oServerAddr.sin_addr.s_addr = iIp;
oServerAddr.sin_port = htons(usPort);
if (connect(iSockFd, (sockaddr *)&oServerAddr, sizeof(oServerAddr)) < )
{
cerr << "fail to connect to " << szIp << ":" << usPort << ", err: " << strerror(errno) << endl;
return -;
}
cout << "connect to " << szIp << ":" << usPort << endl; ssize_t iSendLen = send(iSockFd, szMsg, uiMsgLen, );
if (iSendLen < )
{
cerr << "fail to send, err: " << strerror(errno) << endl;
return -;
}
cout << "send len: " << iSendLen << ", msg: " << szMsg << endl; char szRecvBuf[ * ];
char *pRecvBuf = szRecvBuf;
size_t uiBufLen = sizeof(szRecvBuf);
size_t uiRecvTotal = ;
while (uiRecvTotal < iSendLen)
{
ssize_t iRecvLen = recv(iSockFd, pRecvBuf, uiBufLen, );
if (iRecvLen < )
{
cerr << "fail to recv, close connection, err: " << strerror(errno) << endl;
close(iSockFd);
return -;
}
if (iRecvLen == )
{
cout << "connection closed by server" << endl;
close(iSockFd);
break;
}
pRecvBuf += iRecvLen;
uiBufLen -= iRecvLen;
uiRecvTotal += iRecvLen;
}
szRecvBuf[uiRecvTotal] = '\0';
cout << "recv len: " << uiRecvTotal << ", msg: " << szRecvBuf << endl;
close(iSockFd); return ;
}
TCP服务器/客户端代码示例的更多相关文章
- UDP服务器/客户端代码示例
UDP服务器代码: #include <errno.h> #include <string.h> #include <stdlib.h> #include < ...
- SFTP客户端代码示例
参考链接:SFTP客户端代码示例 操作系统:Windows7/8,VS2013 环境:libssh2 1.4.3.zlib-1.2.8.openssl-1.0.1g 原文: “从http://www. ...
- socket模块实现基于UDP聊天模拟程序;socketserver模块实现服务端 socket客户端代码示例
socket模块 serSocket.setblocking(False) 设置为非阻塞: #coding=utf-8 from socket import * import time # 用来存储所 ...
- 推荐Java五大微服务器及其代码示例教程
来源素文宅博客:http://blog.yoodb.com/yoodb/article/detail/1339 微服务越来越多地用于开发领域,因为开发人员致力于创建更大,更复杂的应用程序,这些应用程序 ...
- 【Echo】实验 -- 实现 C/C++下TCP, 服务器/客户端 通讯
本次实验利用TCP/IP, 语言环境为 C/C++ 利用套接字Socket编程,实现Server/CLient 之间简单的通讯. 结果应为类似所示: 下面贴上代码(参考参考...) Server 部分 ...
- socket本地模拟TCP 服务器+客户端(二)
建立两个py文件,分别打开两个cmd界面,即可进行通信.服务器端运用多进程,连续不断的处理从客户端接收到的数据:客户端通过一个list不断给客户端发送数据. (每个连接都必须创建新线程(或进程)来处理 ...
- 【Chat】实验 -- 实现 C/C++下TCP, 服务器/客户端 "多人聊天室"
本次实验利用TCP/IP, 语言环境为 C/C++ 利用套接字Socket编程,以及线程处理, 实现Server/CLient 之间多人的聊天系统的基本功能. 结果大致如: 下面贴上代码(参考参考.. ...
- php的异步非阻塞swoole模块使用(一)实现简易tcp服务器--客户端
//实例化一个swoole客户端 $swclient = new swoole_client(SWOOLE_SOCK_TCP); //建立连接---如果连接无效则退出 )){ echo "连 ...
- [JAVA] Tcp客户端和服务器简单代码
服务器: import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; im ...
随机推荐
- GPU、CPU、FPGA
一.计算核心增加 二者都由寄存器.控制器.逻辑单元构成,但比例很大不同,决定了CPU擅长指令处理,函数调用上:GPU在数据处理(算数运算/逻辑运算)强力很多. NIVIDA基于Maxwell构架的GP ...
- android-基础编程-ExpandableListview
ExpandableListView继承ListView,具有LIstVIew的基本功能.此外具有group/child,由组与子元素组成. 1.布局主要有是三个. a.主布局: <Expand ...
- Jsp+Struts2+JavaBean+DAO开发模式(1)
DAO模式就实现了把数据库表的操作转化对Java类的操作,从而提高程序的可读性,并实现更改数据库的方便性.其架构图如下图. 一共分为五个组件(component) jsp提交页面(一下四其中的一个例子 ...
- SSD磁盘测试不达标排查
最近购买了一块4T的Inter_SSD_D3-4510硬盘安装在了一台DELL PowerEdge R640服务器,经过测试发现磁盘和产品手册上描述的性能相差过大,相当于产品手册性能的1/2,一下是 ...
- Repository 简化实现多条件查询
Repository 在做查询的时候,如果查询条件多的话,linq查询表达式会写的很复杂,比如: public IQueryable<Student> Get(int id, string ...
- 如何使用Visual Studio 2017调试.net库源代码
在Visual Studio 2017按如下步骤设置: 1.取消选中(工具 - >选项 - >调试 - >仅我的代码)复选框.2.确保设置了(工具 - >选项 - >调试 ...
- 一次对SNMP服务的渗透测试
Hacking SNMP Service - The Post Exploitation :Attacking Network - Network Pentesting原文地址:http://www. ...
- web API简介(二):客户端储存之document.cookie API
概述 前篇:web API简介(一):API,Ajax和Fetch 客户端储存从某一方面来说和动态网站差不多.动态网站是用服务端来储存数据,而客户端储存是用客户端来储存数据.document.cook ...
- 学爬虫,需要掌握哪些Python基础?
入手爬虫确实不要求你精通Python编程,但基础知识还是不能忽视的,那么我们需要哪些Python基础呢? 首先我们先来看看一个最简单的爬虫流程: 第一步要确定爬取页面的链接,由于我们通常爬取的内容 ...
- 使用MultipartFile上传文件
转载地址:https://www.cnblogs.com/lunaticcoder/p/9813483.html(具体的看这个这个大佬的博客) 依赖包: <!-- 上传文件依赖组件 --> ...