Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5821
  • 博文数量: 1
  • 博客积分: 124
  • 博客等级: 入伍新兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-28 10:41
文章分类
文章存档

2010年(1)

我的朋友
最近访客

分类: C/C++

2010-08-28 11:25:44

今天上午看了会儿网络编程方面的书,自己就试着写写书上的代码,和我想得一样,错误很多。自己便改了下,粘在这里,并说明一下吧!或许对其他人有帮助
服务器端程序:
#include
#include
#include
#include
#include
#include
#include
#define LISTENQ 5
#define MAXLINE 512
#define HOST_ADDR  "222.22.19.51"
int main()
{
    int listenfd,connfd;
    socklen_t len;
    struct sockaddr_in servaddr,cliaddr;
    char buff[MAXLINE];
    time_t ticks;
    listenfd=socket(AF_INET,SOCK_STREAM,0);
    if(listenfd==0)    {
        printf("Socket created failed!\n");
        return -1;
    }
    servaddr.sin_family=AF_INET;
    servaddr.sin_port=htons(6666);
    servaddr.sin_addr.s_addr=inet_addr(HOST_ADDR);
    if(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0){
        printf("bind failed!\n");
        return -1;
    }
    printf("listening...\n");
    listen(listenfd,LISTENQ);
    while(1){
        len=sizeof(cliaddr);
        connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&len);
        printf("connect from %s,port %d\n",inet_ntoa(cliaddr.sin_addr.s_addr),ntohs(cliaddr.sin_port));
        ticks=time(NULL);
        sprintf(buff,"%.24s\r\n",ctime(&ticks));
        write(connfd,buff,strlen(buff));
        close(connfd);
    }
}
客户端程序:
#include
#include
#include
#include
#define MAXBUFFERSIZE 256
#define PORT 6666
#define HOST_ADDR  "222.22.19.51"
int main()
{
    int sockfd,n;
    char recvbuff[MAXBUFFERSIZE];
    struct sockaddr_in servaddr;
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd<0){
        printf("Socket created failed!\n");
        return -1;
    }
    servaddr.sin_family=AF_INET;
    servaddr.sin_port=htons(6666);
    servaddr.sin_addr.s_addr=inet_addr(HOST_ADDR);
    printf("connecting...\n");
    if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0){
        printf("Connect server failed!\n");
        return -1;
    }
    while((n=read(sockfd,recvbuff,MAXBUFFERSIZE))>0){
        recvbuff[n]=0;
        fputs(recvbuff,stdout);
    }
    if(n<0){
        printf("Read failed!\n");
        return -2;
    }
    return 0;
}

平台 fedora 12 gcc 版本 4.4.4
简要说明一下程序
c/s程序目的:其中客户机使用流套接字向服务器请求日期和时间,服务器在接受到请求后,回答请求并显示客户的地址。
1 #define HOST_ADDR  "222.22.19.51"    服务器ip   6666 端口  最好用宏定义端口(我没有这样用) htons(6666)  即host to net 即字节顺序的一个转换函数,s is short for ‘short’,还有htonl()、ntohs()、ntohl(), l for long ,函数不必细说。关于字节顺序的问题,就要分little—endian与big—endian了,估计大多数pc都是使用的intel构架的cpu,那就是小端机了即little—endian,而网络中的数据传输方式都使用了从高到低的big—endian,所以要经过转换。
2 inet_addr()函数的作用是将点分十进制ip地址转换成in_addr并以网络字节顺序返回。
3 还有一个函数,程序里面没有使用,但最好使用。bzero()具体我不再细说,google一下即可。
4 (struct sockaddr *)&servaddr  是强制类型转换,具体的可以google  sockaddr和sockaddr_in
前面说过的bzero()函数与两者密切相关啊!使用sockaddr_in变量时,最好提前初始化为零。
其他的东西好像任意找一本有关网络编程的书都可以找到,我再说就显得多余了。
就这些,我有个毛病,说话罗罗嗦嗦的,希望这次会好点



























阅读(897) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~