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 ...
随机推荐
- springBoot基础2
主要记录上一篇 springBoot基础 中涉及到的pom.项目结构.注解等 首先是pom: 关于pom中这段插件配置: <plugin> <groupId>org.sprin ...
- C++基础笔记(string截取)
#include <iostream> #include <string> using namespace std; int main(int argc, char* argv ...
- 跨域访问问题js
您可以通过使用JSONP形式的回调函数来加载其他网域的JSON数据 访问百度的地址解析 返回来省,地区,市 $.getJSON("http://api.map.baidu.com/clou ...
- 17.异常(三)之 e.printStackTrace()介绍
一.关于printStackTrace()方法 public void printStackTrace()方法将此throwable对象的堆栈追踪输出至标准错误输出流,作为System.err的值.输 ...
- Visual Stuido快捷键
转自:http://www.cnblogs.com/TankXiao/p/3164995.html 整理了一些VS的快捷键 格式化整个文档:(Ctrl + K, Ctrl + D)智能感知:(Ctrl ...
- 「WC2018」州区划分(FWT)
「WC2018」州区划分(FWT) 我去弄了一个升级版的博客主题,比以前好看多了.感谢 @Wider 不过我有阅读模式的话不知为何 \(\text{LATEX}\) 不能用,所以我就把这个功能删掉了. ...
- layui 富文本 图片上传 后端PHP接口
<!DOCTYPE html> <html> <head> <link rel="stylesheet" type="text/ ...
- [W3bSafe]Metasploit溢出渗透内网主机辅助脚本
文章来源i春秋 脚本用Shell编写 有的内网特别脆弱 本脚本主要就是 测试的话方便一点 输入内网网关就能调用Metasploit全部模块测试整个内网 运行截图<ignore_js_op ...
- Linux下Clamav 杀毒软件安装使用文档
一.安装Clamav杀毒工具 0.安装Clamav需要的依赖包 yum install libxml* openssl* -y 1.创建clamav组 groupadd clamav 2.创建clam ...
- CUDA driver version is insufficient for CUDA runtime version 解决
配置ubuntu17.1+CUDA9.2的caffe环境,CUDA sample编译完成,执行到./deviceQuery时报错:CUDA driver version is insufficient ...