TCP服务器端得helloworld
1.程序
从《unix网络编程》抄来了,改了一点,原书使用自己封装的函数,这里都使用原始的。使用c++的stringstream和string做buffer进行write,尝试了一下。
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char ** argv)
{
int
listenfd = socket(AF_INET, SOCK_STREAM, 0);//创建socket fd
if(listenfd
< 0){
std::cout<
exit(1);
}
sockaddr_in
servaddr;
bzero(&servaddr,
sizeof(servaddr));
servaddr.sin_family
= AF_INET;
servaddr.sin_addr.s_addr
= htonl(INADDR_ANY);//地址为INADDR_ANY表示监听本机所有网络接口
servaddr.sin_port
= htons(1500);//监听端口,客户端程序必须连接这个端口才能与服务器交互
//bind函数将socket fd 与相应的地址和端口号绑定。
if(bind(listenfd,
(sockaddr*)(&servaddr), sizeof(servaddr)) < 0){
std::cout<
exit(1);
}
//listen方法将socket fd转换为listen fd,第二个参数表示等待队列长度
if(listen(listenfd,
5) < 0){
std::cout<
exit(1);
}
//服务器一般都是一个死循环
for(;;){
//监听,等待客户端的链接,accept函数是一个阻塞函数,如果客户端不连接服务器,程序将在这里停下。
//函数返回一个连接fd,服务器使用该fd与连接进来的客户端交互,跟普通的文件fd类似。
int connfd
= accept(listenfd, 0, 0);
if(connfd
< 0){
std::cout<
continue;
}
std::cout<
time_t
ticks = std::time(0);
std::stringstream
strout;
strout/write方法向客户端发送包
//这里没有使用char 数组做buff传送,而是使用了string,暂时没有研究过效率如何。
//测试过,客户端没有read函数时这个write也可以成功返回
int n =
write(connfd, strout.str().c_str(),strout.str().size());
if(n
< 0){
std::cout<
}
else{
std::cout<
}
//发送完毕主动关闭连接,客户端受到关闭链接消息后会退出循环(见客户端程序)
close(connfd);
}
}
2.下一步工作
下一步打算改造一下服务器,做一个log监控服务器,客户端向服务器发送查询log命令,服务器返回对应的log文件。
客户端暂时不管了,用telnet来调试。
阅读(651) | 评论(0) | 转发(0) |