socket server
我的第一个socket 编程。
首先创建一个server 类, 然后在类中添加四个成员.
初始化。
TcpServer (listenPort)
记得在初始化servAddr 的时候要 先清零. 因为该成员的最后八位是0 。为了方便所以直接清零。
bzero(&servAddr, sizeof(servAddr)); 要记得加 & 因为servAddr 是一个类, 不是一个数值。
isAccept()
这个accept 函数, 记得在 &len, 并不止是简单的sizeof(clntAddr)
handleEcho()
这个函数最简单了, 只要记得
数据的交流, 就是communicationSock,
recv 返回值,如果小于零就是失败, 等于零就是对方主动关闭链接。 大于零就是这次发送的长度
要记得在TCP 上传送的是以回车为一个语句。 但是 它传过来的并不包含'\0'
View Code
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<arpa/inet.h>
class TcpServer
{
private:
int listenSock;
int communicationSock;
sockaddr_in servAddr;
sockaddr_in clntAddr;
public:
TcpServer(int listenPort);
bool isAccept();
void handleEcho();
};
TcpServer::TcpServer(int listenPort)
{
if ((listenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
{
throw "socket()failed";
}
bzero(&servAddr, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(listenPort);
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(listenSock, (sockaddr *) &servAddr, sizeof(servAddr)) < 0)
{
throw "bind()failed";
}
if (listen(listenSock , 10) < 0)
{
throw "listen()failed";
}
}
bool TcpServer::isAccept()
{
unsigned int len = sizeof(clntAddr);
if ((communicationSock = accept(listenSock, (sockaddr *) &clntAddr, &len)) < 0)
{
return false;
}
else
{
printf("client ip:(%s)\n", inet_ntoa(clntAddr.sin_addr));
return true;
}
}
void TcpServer::handleEcho()
{
const int BUFFLEN = 32;
char buffer[BUFFLEN];
int len;
bool goon = true;
while (goon)
{
if ((len = recv(communicationSock, buffer, BUFFLEN, 0)) < 0)
{
throw "recv()failed";
}
if (len == 0)
{
printf("exit()success\n");
goon = false;
}
else
{
buffer[len] = 0;
printf("%s\n", buffer);
if (len != send(communicationSock, buffer, len, 0))
{
throw "send()failed";
}
}
}
close(communicationSock);
}
int echo_server(int argc, char *argv[]);
int main(int argc, char *argv[])
{
int mainRtn = 0;
try
{
mainRtn = echo_server(argc, argv);
}
catch(const char *s)
{
perror(s);
exit(EXIT_FAILURE);
}
return mainRtn;
}
int echo_server(int argc, char *argv[])
{
int port = 5000;
if (argc == 2)
{
port = atoi(argv[1]);
}
TcpServer myServer(port);
while (true)
{
if (myServer.isAccept())
{
myServer.handleEcho();
break;
}
}
return 0;
}