【发布时间】:2014-04-16 12:44:08
【问题描述】:
我是网络编程的新手,我正在关注“unix 网络编程,套接字网络 api”一书。我正在尝试本书的第一个示例,即日间服务器。我为客户端和服务器编写了这些代码。我从一个终端执行 server.cpp,从另一个终端执行 client.cpp。(./a.out 127.0.0.1) 我应该将时间作为输出,但我不断收到连接错误。有人可以帮帮我吗?
客户端.cpp
#include "unp.h"
int main(int argc, char** argv)
{
int sockfd,n;
struct sockaddr_in servaddr;
char recvline[MAXLINE+1];
if(argc!=2)
{
err_quit("Usage ./a.out <IPaddress>\n");
}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
{
err_quit("Socket error\n");
}
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(13);
if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)<=0)
{
err_quit("inet_pton error");
}
if(connect(sockfd,(sockaddr *) &servaddr,sizeof(servaddr))<0)
{
err_quit("connect error\n");
}
while((n=read(sockfd,recvline,MAXLINE))>0)
{
recvline[n]=0;
if(fputs(recvline,stdout)==EOF)
{
err_quit("fputs error\n");
}
}
if(n<0)
{
err_quit("read error\n");
}
exit(0);
return 0;
}
服务器.cpp
#include "unp.h"
int main(int argc,char** argv)
{
int listenfd,connfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
time_t ticks;
listenfd=socket(AF_INET,SOCK_STREAM,0);
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(13);
bind(listenfd,(sockaddr *)&servaddr,sizeof(servaddr));
listen(listenfd,LISTENQ);
for(;;)
{
connfd=accept(listenfd, (sockaddr *)NULL,NULL);
ticks=time(NULL);
snprintf(buff,sizeof(buff),"%.24s\r\n",ctime(&ticks));
write(connfd,buff,strlen(buff));
close(connfd);
}
exit(0);
}
unp.h
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/time.h>
#include<time.h>
#include<sys/wait.h>
#include<sys/un.h>
#include<string.h>
#include<sys/uio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<netdb.h>
#include<signal.h>
#include<fcntl.h>
#include<errno.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#define MAXLINE 4096
#define LISTENQ 1024
using namespace std;
void err_quit(const char *x)
{
printf("%s",x);
exit(-1);
}
【问题讨论】:
-
@user3541036 代码是正确的。服务器是否侦听接口 0.0.0.0 上的端口 13?尝试 sudo netstat -anlpl | grep 13
-
应该是,但是如何检查它是否在听?
-
在控制台输入(运行服务器后):sudo netstat -anlpl | grep 13
-
好的,我做到了。现在它显示了很多行。除了两个之外,其他所有人都已连接,两个正在收听。 unix 2 [ ACC ] STREAM LISTENING 13354 1800/gnome-session /tmp/.ICE-unix/1800 unix 2 [ ACC ] STREAM LISTENING 13353 1800/gnome-session @/tmp/.ICE-unix/1800 数字是多少?
-
你的服务器没有监听,你运行了吗?
标签: c++ sockets tcp network-programming client