我是c编程的新手,我目前正在尝试理解网络编程的概念。有一个简单的服务器代码,我试图在Kali linux(基于Debian的Linux系统)上运行但是有一些我无法调试的错误。请看一下我的代码。
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <time.h>
#include <stdlib.h>
#define SA struct sockaddr
#define MAXLINE 4096
int main(int argc,int **argv)
{
int roockfd,confd;
socklen_t len;
struct sockaddr_in servaddr,cliaddr;
char buff[MAXLINE];
time_t ticks;
roockfd = socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(13);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
Bind(roockfd,(SA*)&servaddr,sizeof(servaddr));
Listen(roockfd,5);
for(; ;)
{
len=sizeof(cliaddr);
confd= Accept(roockfd,(SA*)&cliaddr,&len);
printf("Connection from %s, port %d\n",
Inet_ntop(AF_INET,&cliaddr.sin_addr,buff,sizeof(buff)),
ntohs(cliaddr.sin_port));
ticks=time(NULL);
snprintf(buff,sizeof(buff),"%.24s\r\n", ctime(ticks));
printf(confd,buff,strlen(buff));
close(confd);
}
}
等待您的宝贵回应。
答案 0 :(得分:3)
有几个错误:
bzero
,请在文件中加入#include <strings.h>
。请注意bzero
是BSD中使用的过时函数,您应该考虑使用memset(&servaddr, 0, sizeof(servaddr))
。Bind
,Listen
,Inet_ntop
和Accept
不是标准套接字函数,要么错误地将它们大写,如果是这种情况,请更改为{ {1}},bind
,listen
和inet_ntop
。或者它们是套接字接口的自定义包装器,如果是这种情况,请在文件中包含相应的标头。 答案 1 :(得分:3)
这是编译的代码的一个版本。请将其与原始版本进行比较,并尝试了解更改。我同意@ fluter的建议。要编译它还需要更多的东西。但是,我无法验证其操作或行为。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define SA struct sockaddr
#define MAXLINE 4096
int main(int argc, char *argv[])
{
int roockfd, confd;
socklen_t len;
struct sockaddr_in servaddr, cliaddr;
char buff[MAXLINE];
time_t ticks;
roockfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(13);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(roockfd, (SA *)&servaddr, sizeof(servaddr));
listen(roockfd, 5);
for (; ;) {
len = sizeof(cliaddr);
confd = accept(roockfd, (SA *)&cliaddr, &len);
printf("Connection from %s, port %d\n",
inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)),
ntohs(cliaddr.sin_port));
ticks = time(NULL);
snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
write(confd, buff, strlen(buff));
close(confd);
}
}