原来看TCP/IP详解的书的时候,TCP/IP的知识比较缺乏,第一个程序始终得不到任何响应。使用的是send和recvfrom函数。
后来,看UNIX网络编程,使用了第一个程序,然后使用其后附带的ip206.168.112.96,很快就等到了一个日期字符串。
在其后还有一个提供日期服务的程序,在本机上运行了一个。然后直接调用本机的日期服务,很快就得到数据。
下面这个是监听程序。编译后运行在本机,由于其有一个无限循环函数,会一直运行。
/*
* =====================================================================================
*
* Filename: time_server.c
*
* Description: listen 13 port,and supply date time info
*
* Version: 1.0
* Created: 06/02/2010 12:53:54 PM
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Company:
*
* =====================================================================================
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
//#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h> /* inet(3) functions */
#include <fcntl.h> /* for nonblocking */
#include <netdb.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h> /* for S_xxx file mode constants */
#include <sys/uio.h> /* for iovec{} and readv/writev */
#include <unistd.h>
#include <sys/wait.h>
#include <sys/un.h> /* for Unix domain sockets */
#include <time.h>
#define MAXLINE 256
#define SA struct sockaddr
#define LISTENQ 1024 /* 2nd argument to listen() */
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);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(13);/* daytime server */
bind(listenfd,(SA*)&servaddr,sizeof(servaddr));
listen(listenfd,LISTENQ);
for(;;){
connfd=accept(listenfd,(SA*)NULL,NULL);
ticks=time(NULL);
snprintf(buff,sizeof(buff),"%.24s\r\n",ctime(&ticks));
write(connfd,buff,strlen(buff));
close(connfd);
}
}
//////////////////////////////////////////////////////////////////////
这个获得数据的代码,编译为a.ou后,./a.out localhost就可以得到上面的程序的输出。
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
//#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h> /* inet(3) functions */
#include <fcntl.h> /* for nonblocking */
#include <netdb.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h> /* for S_xxx file mode constants */
#include <sys/uio.h> /* for iovec{} and readv/writev */
#include <unistd.h>
#include <sys/wait.h>
#include <sys/un.h> /* for Unix domain sockets */
#define MAXLINE 256
int
main(int argc, char **argv)
{
int sockfd,n;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr;
if (argc != 2)
printf("usage: a.out <IPaddress>");
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
printf("socket error");
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(13); /* daytime server */
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr)<=0)
printf("inet_pton error for %s", argv[1]);
if (connect(sockfd, /* (sockaddr *)*/ &servaddr, sizeof(servaddr)) < 0)
printf("connect error");
while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
recvline[n] = 0; /* null terminate */
if (fputs(recvline, stdout) == EOF)
printf("fputs error");
}
if (n < 0)
printf("read error");
exit(0);
}
ps。WTO又在为我们做好事( 为什么关心�朝屁民的永远的帝国主义呢),希望不久的将来能看到blogspot解封,我就能亲眼看一看我自己的博客长什么样了。
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment