TCP服务器/客户端代码示例

TCP服务器代码:

  1 #include <errno.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 #include <sys/types.h>
  5 #include <sys/socket.h>
  6 #include <netinet/in.h>
  7 #include <arpa/inet.h>
  8 #include <iostream>
  9
 10 using namespace std;
 11
 12 int main(int argc, char *argv[])
 13 {
 14     if (argc != 3)
 15     {
 16         cout << "usage: " << argv[0] << " ip port" << endl;
 17         return -1;
 18     }
 19
 20     char *szIp = argv[1];
 21     in_addr_t iIp = inet_addr(szIp);
 22     if (iIp == INADDR_NONE)
 23     {
 24         cerr << "fail to parse ip: " << szIp << endl;
 25         return -1;
 26     }
 27     char *pEnd = NULL;
 28     uint16_t usPort = strtoul(argv[2], &pEnd, 10);
 29     if (*pEnd != ‘\0‘)
 30     {
 31         cerr << "fail to parse port: " << argv[2] << endl;
 32         return -1;
 33     }
 34
 35     int iSockFd = socket(AF_INET, SOCK_STREAM, 0);
 36     if (iSockFd < 0)
 37     {
 38         cerr << "fail to create socket, err: " << strerror(errno) << endl;
 39         return -1;
 40     }
 41     cout << "create socket fd " << iSockFd << endl;
 42
 43     sockaddr_in oAddr;
 44     memset(&oAddr, 0, sizeof(oAddr));
 45     oAddr.sin_family = AF_INET;
 46     oAddr.sin_addr.s_addr = iIp;
 47     oAddr.sin_port = htons(usPort);
 48     if (bind(iSockFd, (sockaddr *)&oAddr, sizeof(oAddr)) < 0)
 49     {
 50         cerr << "fail to bind addr " << szIp << ":" << usPort << ", err: " << strerror(errno) << endl;
 51         return -1;
 52     }
 53     cout << "bind addr " << szIp << ":" << usPort << endl;
 54
 55     if (listen(iSockFd, 100) < 0)
 56     {
 57         cerr << "fail to listen on " << szIp << ":" << usPort << ", err: " << strerror(errno) << endl;
 58     }
 59     cout << "listen on socket fd " << iSockFd << endl;
 60
 61     uint8_t acRecvBuf[1024 * 1024];
 62     while (true)
 63     {
 64         sockaddr_in oClientAddr;
 65         socklen_t iAddrLen = sizeof(oClientAddr);
 66         int iAcceptFd = accept(iSockFd, (sockaddr *)&oClientAddr, &iAddrLen);
 67         if (iAcceptFd < 0)
 68         {
 69             cerr << "fail to accpet, err: " << strerror(errno) << endl;
 70             continue;
 71         }
 72         cout << "recv connection from " << inet_ntoa(oClientAddr.sin_addr) << ":" << ntohs(oClientAddr.sin_port) << endl;
 73
 74         while (true)
 75         {
 76             ssize_t iRecvLen = recv(iAcceptFd, acRecvBuf, sizeof(acRecvBuf), 0);
 77             if (iRecvLen < 0)
 78             {
 79                 cerr << "fail to recv, close connection, err: " << strerror(errno) << endl;
 80                 close(iAcceptFd);
 81                 break;
 82             }
 83             if (iRecvLen == 0)
 84             {
 85                 cout << "connection closed by client" << endl;
 86                 close(iAcceptFd);
 87                 break;
 88             }
 89             cout << "recv data len: " << iRecvLen << endl;
 90
 91             ssize_t iSendLen = send(iAcceptFd, acRecvBuf, iRecvLen, 0);
 92             if (iSendLen < 0)
 93             {
 94                 cerr << "fail to send, err: " << strerror(errno) << endl;
 95                 close(iAcceptFd);
 96                 break;
 97             }
 98             cout << "echo to client, len: " << iSendLen << endl;
 99         }
100
101     }
102 }

TCP客户端代码:

 1 #include <errno.h>
 2 #include <string.h>
 3 #include <sys/types.h>
 4 #include <sys/socket.h>
 5 #include <netinet/in.h>
 6 #include <arpa/inet.h>
 7 #include <stdlib.h>
 8 #include <iostream>
 9
10 using namespace std;
11
12 int main(int argc, char *argv[])
13 {
14     if (argc != 4)
15     {
16         cout << "usage: " << argv[0] << " ip port message" << endl;
17         return -1;
18     }
19
20     char *szIp = argv[1];
21     in_addr_t iIp = inet_addr(szIp);
22     if (iIp == INADDR_NONE)
23     {
24         cerr << "fail to parse ip: " << szIp << endl;
25         return -1;
26     }
27     char *pEnd = NULL;
28     uint16_t usPort = strtoul(argv[2], &pEnd, 10);
29     if (*pEnd != ‘\0‘)
30     {
31         cerr << "fail to parse port: " << argv[2] << endl;
32         return -1;
33     }
34     char *szMsg = argv[3];
35     size_t uiMsgLen = strlen(szMsg);
36
37     int iSockFd = socket(AF_INET, SOCK_STREAM, 0);
38     if (iSockFd < 0)
39     {
40         cerr << "fail to create socket, err: " << strerror(errno) << endl;
41         return -1;
42     }
43     cout << "create socket fd " << iSockFd << endl;
44
45     sockaddr_in oServerAddr;
46     memset(&oServerAddr, 0, sizeof(oServerAddr));
47     oServerAddr.sin_family = AF_INET;
48     oServerAddr.sin_addr.s_addr = iIp;
49     oServerAddr.sin_port = htons(usPort);
50     if (connect(iSockFd, (sockaddr *)&oServerAddr, sizeof(oServerAddr)) < 0)
51     {
52         cerr << "fail to connect to " << szIp << ":" << usPort << ", err: " << strerror(errno) << endl;
53         return -1;
54     }
55     cout << "connect to " << szIp << ":" << usPort << endl;
56
57     ssize_t iSendLen = send(iSockFd, szMsg, uiMsgLen, 0);
58     if (iSendLen < 0)
59     {
60         cerr << "fail to send, err: " << strerror(errno) << endl;
61         return -1;
62     }
63     cout << "send len: " << iSendLen << ", msg: " << szMsg << endl;
64
65     char szRecvBuf[1024 * 1024];
66     char *pRecvBuf = szRecvBuf;
67     size_t uiBufLen = sizeof(szRecvBuf);
68     size_t uiRecvTotal = 0;
69     while (uiRecvTotal < iSendLen)
70     {
71         ssize_t iRecvLen = recv(iSockFd, pRecvBuf, uiBufLen, 0);
72         if (iRecvLen < 0)
73         {
74             cerr << "fail to recv, close connection, err: " << strerror(errno) << endl;
75             close(iSockFd);
76             return -1;
77         }
78         if (iRecvLen == 0)
79         {
80             cout << "connection closed by server" << endl;
81             close(iSockFd);
82             break;
83         }
84         pRecvBuf += iRecvLen;
85         uiBufLen -= iRecvLen;
86         uiRecvTotal += iRecvLen;
87     }
88     szRecvBuf[uiRecvTotal] = ‘\0‘;
89     cout << "recv len: " << uiRecvTotal << ", msg: " << szRecvBuf << endl;
90     close(iSockFd);
91
92     return 0;
93 }
时间: 2024-10-14 03:49:50

TCP服务器/客户端代码示例的相关文章

UDP服务器/客户端代码示例

UDP服务器代码: 1 #include <errno.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <sys/types.h> 5 #include <sys/socket.h> 6 #include <netinet/in.h> 7 #include <arpa/inet.h> 8 #include <iostream> 9 10 usi

SFTP客户端代码示例

SFTP客户端代码示例 环境:libssh2 1.4.3.zlib-1.2.8.openssl-1.0.1g Author: Kagula 最后更新日期:2014-5-18 从http://www.libssh2.org/下载libssh2-1.4.3.tar.gz文件,解压后打开libssh2.dsw文件升级项目到VisualStudio 2013,里面有两个项目,只要编译libssh2项目就可以了.编译前需要添加zlib和openssl的头文件和库文件链接位置,如果编译libssh2提示找不

Kafka JAVA客户端代码示例--高级应用

什么时间使用高级应用? 针对一个消息读取多次 在一个process中,仅仅处理一个topic中的一组partitions 使用事务,确保每个消息只被处理一次 使用高级应用(调用较底层函数)的缺点? SimpleConsumer需要做很多额外的工作(在以groups方式进行消息处理时不需要) 在应用程序中跟踪上次消息处理的offset 确定一个topic partition的lead broker 手工处理broker leander的改变 使用底层函数(SimpleConsumer)开发的步骤

Windows 下的最简单的TCP服务器客户端

他们是短连接的,服务器接受客户端之后,马上发送一个消息,发送完以后立即将客户端断开掉,然后继续等待下一个连接. 使用Winsocket2必须要引用到的头文件和需要包含到的链接库文件: #include <WinSock2.h> #pragma comment( lib, "ws2_32.lib" ) 以下代码是Winsocket2的系统初始化和关闭的封装代码. class WinSocketSystem { public: WinSocketSystem() { int i

【Echo】实验 -- 实现 C/C++下TCP, 服务器/客户端 通讯

本次实验利用TCP/IP, 语言环境为 C/C++ 利用套接字Socket编程,实现Server/CLient 之间简单的通讯. 结果应为类似所示: 下面贴上代码(参考参考...) Server 部分: 1 /* TCPServer.cpp - main */ 2 3 #include <stdlib.h> 4 #include <stdio.h> 5 #include <winsock2.h> 6 #include <time.h> 7 #include

socket编程:简单TCP服务器/客户端编程

其实对于socket:我们需要理解的是他提供了一种编程概念,利用socket就可以利用系统已经封装好的内部进行通信,我们只需要关注应用层方面的数据控制就OK了. 一. 套接字(socket) socket英文为插座的意思,也就是为用户提供了一个接入某个链路的接口.而在计算机网络中,一个IP地址标识唯一一台主机,而一个端口号标识着主机中唯一一个应用进程,因此"IP+端口号"就可以称之为socket. 两个主机的进程之间要通信,就可以各自建立一个socket,其实可以看做各自提供出来一个&

【Chat】实验 -- 实现 C/C++下TCP, 服务器/客户端 &quot;多人聊天室&quot;

本次实验利用TCP/IP, 语言环境为 C/C++ 利用套接字Socket编程,以及线程处理, 实现Server/CLient 之间多人的聊天系统的基本功能. 结果大致如: 下面贴上代码(参考参考...) Server 部分: 1 /* TCPdtd.cpp - main, TCPdaytimed */ 2 3 #include <stdlib.h> 4 #include <stdio.h> 5 #include <winsock2.h> 6 #include <

一个TCP服务器和客户端示例-网络编程

创建了一个TCP时间戳服务器,并创建了对应的客户端程序,两者的通信都在同一台PC上实现(手边只有一台笔记本,sorry...) 1.TCP 服务器 简单解释一下: 利用最基本的socket模块实现, 总体的效果是客户端发送消息,服务器端对消息打上时间戳,并发送回客户端: HOST为空,也即默认为本机: TCP的套接字家族名称为AF_INET,套接字类型为SOCK_STREAM; 利用bind方法绑定地址,listen方法进行监听: while循环模拟了真实的服务器工作场景,也即永不停机的进行监听

[JAVA] Tcp客户端和服务器简单代码

服务器: 1 import java.io.DataInputStream; 2 import java.io.DataOutputStream; 3 import java.io.IOException; 4 import java.net.ServerSocket; 5 import java.net.Socket; 6 7 public class TcpServer { 8 public static void main(String [] args) throws IOExceptio