linux socket的bug??

某日写了一个tcp的socket程序,偶然发现可能是linux socket的一个bug,根据有关资料
listen函数所接受的连接数应该是((3 * backlog) / 2) + 1,但是实际结果并非如此。
/**********************************************
作者:猪头流氓
时间:Sun Jan  7 02:46:39 2007
文件名:server.c
描述:
**********************************************/
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <time.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>
int sendtime(int fd);
void print_date();
int main()
{
        int sockfd;
        struct sockaddr_in my_addr;
        struct sockaddr_in their_addr;
        int newfd;
        char buf[10];
        int sockaddr_len;
        int rt;

        if((sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) <= 0) {
                perror("Create socket faild!/n");
                return -1;
        }
        bzero(&my_addr, sizeof(struct sockaddr));
        my_addr.sin_family = PF_INET;
        my_addr.sin_port = htons(5555);
        my_addr.sin_addr.s_addr = inet_addr("192.168.0.2");
        if(bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) < 0)
          {
                perror("Bind faild!/n");
                return -2;
          }
        if(listen(sockfd,1) < 0) {
                perror("Listen error!");
        }
        sockaddr_len = sizeof(struct sockaddr);
        while(1) {
                newfd = accept(sockfd,(struct sockaddr *)&their_addr, (socklen_t *)&sockaddr_len);

                printf("Accept:%s,at ",inet_ntoa(their_addr.sin_addr));
                print_date();
                if(newfd < 0) {
                        perror("Accept error!/n");
                        return -3;
                }
                /*
                   if(fork() == 0) {
                   printf("Fork() sucessed/n");
                   close(sockfd);
                   sendtime(newfd);
                   close(newfd);
                   return 0;
                   }
                 */
                if((rt = read(newfd, buf, 7)) != 7) {
                        perror("Get date error/n");
                        continue;
                }

                if(!strcmp(buf,"getdate")) {
                        sendtime(newfd);
                } else {
                        printf("Wrong commands/n");
                }
                close(newfd);
        }
        return 0;
}

int sendtime(int fd)
{
        time_t tm;
        int rt;
        tm=time(NULL);
        rt=write(fd, &tm, sizeof(time_t));
        if(rt == sizeof(time_t)) {
                printf("Send sucessed!/n");
        } else {
                printf("Send error!/n");
        }
        return 0;
}

void print_date()
{
        time_t tm;
        time(&tm);
        printf("%s", ctime(&tm));
}

 

/**********************************************
作者:猪头流氓
时间:Sun Jan  7 02:46:33 2007
文件名:client.c
描述:
**********************************************/
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <time.h>
#include <string.h>
#include <unistd.h>
void print_date();
int main(int argc, char **argv)
{
        int sockfd;
        struct sockaddr_in their_addr;
        int newfd;
        time_t tm;
        int sockaddr_len;
        int rt, addr_len;

        if(argc != 2) {
                perror("Input error/nUsage:client 192.168.0.1/n");
                return -1;
        }

        if((sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) <= 0) {
                perror("Create socket faild!/n");
                return -2;
        }

        bzero(&their_addr, sizeof(struct sockaddr_in));
        their_addr.sin_family = PF_INET; 
        their_addr.sin_port = htons(5555);
        their_addr.sin_addr.s_addr = inet_addr(argv[1]);

        addr_len = sizeof(struct sockaddr);

        if(connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) < 0) {
                perror("Connect faild!/n");
                return -3;
        }
        printf("connected/n");
        print_date();
        sleep(40);
        rt = write(sockfd, "getdate", 8);
        rt = read(sockfd,&tm,sizeof(time_t));
        if(rt > 0) {
                printf("%s/n",ctime(&tm));
        }
        return 0;

}
void print_date()
{
        time_t tm;
        time(&tm);
        printf("%s/n", ctime(&tm));

}

 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值