TCP服务器/客户端代码示例
2015-08-30 21:12
441 查看
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 != 3) { cout << "usage: " << argv[0] << " ip port" << endl; return -1; } char *szIp = argv[1]; in_addr_t iIp = inet_addr(szIp); if (iIp == INADDR_NONE) { cerr << "fail to parse ip: " << szIp << endl; return -1; } char *pEnd = NULL; uint16_t usPort = strtoul(argv[2], &pEnd, 10); if (*pEnd != '\0') { cerr << "fail to parse port: " << argv[2] << endl; return -1; } int iSockFd = socket(AF_INET, SOCK_STREAM, 0); if (iSockFd < 0) { cerr << "fail to create socket, err: " << strerror(errno) << endl; return -1; } cout << "create socket fd " << iSockFd << endl; sockaddr_in oAddr; memset(&oAddr, 0, 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)) < 0) { cerr << "fail to bind addr " << szIp << ":" << usPort << ", err: " << strerror(errno) << endl; return -1; } cout << "bind addr " << szIp << ":" << usPort << endl; if (listen(iSockFd, 100) < 0) { cerr << "fail to listen on " << szIp << ":" << usPort << ", err: " << strerror(errno) << endl; } cout << "listen on socket fd " << iSockFd << endl; uint8_t acRecvBuf[1024 * 1024]; while (true) { sockaddr_in oClientAddr; socklen_t iAddrLen = sizeof(oClientAddr); int iAcceptFd = accept(iSockFd, (sockaddr *)&oClientAddr, &iAddrLen); if (iAcceptFd < 0) { 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), 0); if (iRecvLen < 0) { cerr << "fail to recv, close connection, err: " << strerror(errno) << endl; close(iAcceptFd); break; } if (iRecvLen == 0) { cout << "connection closed by client" << endl; close(iAcceptFd); break; } cout << "recv data len: " << iRecvLen << endl; ssize_t iSendLen = send(iAcceptFd, acRecvBuf, iRecvLen, 0); if (iSendLen < 0) { 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 != 4) { cout << "usage: " << argv[0] << " ip port message" << endl; return -1; } char *szIp = argv[1]; in_addr_t iIp = inet_addr(szIp); if (iIp == INADDR_NONE) { cerr << "fail to parse ip: " << szIp << endl; return -1; } char *pEnd = NULL; uint16_t usPort = strtoul(argv[2], &pEnd, 10); if (*pEnd != '\0') { cerr << "fail to parse port: " << argv[2] << endl; return -1; } char *szMsg = argv[3]; size_t uiMsgLen = strlen(szMsg); int iSockFd = socket(AF_INET, SOCK_STREAM, 0); if (iSockFd < 0) { cerr << "fail to create socket, err: " << strerror(errno) << endl; return -1; } cout << "create socket fd " << iSockFd << endl; sockaddr_in oServerAddr; memset(&oServerAddr, 0, 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)) < 0) { cerr << "fail to connect to " << szIp << ":" << usPort << ", err: " << strerror(errno) << endl; return -1; } cout << "connect to " << szIp << ":" << usPort << endl; ssize_t iSendLen = send(iSockFd, szMsg, uiMsgLen, 0); if (iSendLen < 0) { cerr << "fail to send, err: " << strerror(errno) << endl; return -1; } cout << "send len: " << iSendLen << ", msg: " << szMsg << endl; char szRecvBuf[1024 * 1024]; char *pRecvBuf = szRecvBuf; size_t uiBufLen = sizeof(szRecvBuf); size_t uiRecvTotal = 0; while (uiRecvTotal < iSendLen) { ssize_t iRecvLen = recv(iSockFd, pRecvBuf, uiBufLen, 0); if (iRecvLen < 0) { cerr << "fail to recv, close connection, err: " << strerror(errno) << endl; close(iSockFd); return -1; } if (iRecvLen == 0) { 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 0; }
相关文章推荐
- Liunx学习笔记--基本网络设定(测试内容)
- 九、MDT 2013 Update 1批量部署-第三方PXE无盘网络启动配套使用
- iOS学习总结之网络编程
- Android4.0以上版本Http请求的问题
- Volley理解
- [网络转载 ]LoadRunner技巧之THML与URL两种录制模式分析
- 网络协议
- configure: error: in `/root/httpd-2.2.11/srclib/apr': c
- HTTP API选择WinInet or WinHttp?
- TCP/IP协议详解内容总结(怒喷一口老血)
- 计算机网络知识点
- 强制使用处于TIME_WAIT的TCP状态的socket地址
- Atitit.request http乱码的设计防止 检测与解决最近实践p825 attilax总结.doc
- Atitit.request http乱码的设计防止 检测与解决最近实践p825 attilax总结.doc
- Atitit.request http乱码的设计防止 检测与解决最近实践p825 attilax总结.doc
- oracle网络配置listener.ora、sqlnet.ora、tnsnames.ora
- ios Communicating with HTTP Servers 与HTTP服务器通信 官方文档翻译(五)
- SCADA组态系统将主宰新的网络安全领域
- HTTP Get,Post请求详解
- .net学习笔记---HttpRuntime类