您的位置:首页 > 理论基础 > 计算机网络

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

2015-08-30 21:12 441 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: