Chinaunix首页 | 论坛 | 博客
  • 博客访问: 581599
  • 博文数量: 213
  • 博客积分: 6789
  • 博客等级: 准将
  • 技术积分: 1947
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-01 17:11
文章分类

全部博文(213)

文章存档

2012年(9)

2011年(62)

2010年(99)

2009年(43)

分类: C/C++

2010-07-02 16:50:54

server.c
#include
#include
#include
#include
#include
#include
#include
#include

#define DEFAULTPORT         2014
#define DEFAULT_BACKLOG     20
int main(int argc ,char *argv[])
{
    struct sockaddr_in socket_addr;
    struct sockaddr_in socket_acpt;
    char buf[30] = {0};
    int recv_len;
    int acpt_len = sizeof(struct sockaddr_in);
    int accept_clt;

    memset(&socket_addr, 0, sizeof(socket_addr));
    socket_addr.sin_family = AF_INET;
    socket_addr.sin_port = htons(DEFAULTPORT);
    socket_addr.sin_addr.s_addr = htons(INADDR_ANY);
    bzero(&(socket_addr.sin_zero), 8);


    int socket_fd = socket(PF_INET, SOCK_STREAM, 0);
    if (socket_fd == -1){
        printf("Socket Error log is : %s\n", strerror(errno));
        close(socket_fd);
        exit(0);
    }


    if (bind(socket_fd, (struct sockaddr *)&socket_addr, sizeof(struct sockaddr_in)) == -1){
        printf("Bind Error log is : %s\n", strerror(errno));
        close(socket_fd);
        exit(0);
    }
    else
    {
        if (listen(socket_fd, DEFAULT_BACKLOG) == -1){
            printf("Listen Error log is : %s\n", strerror(errno));
            close(socket_fd);
            exit(0);
        }
        else
        {
            while(1){
                accept_clt = accept(socket_fd, (struct sockaddr *)&socket_acpt, (socklen_t *)&acpt_len);
                if(accept_clt == -1){
                    printf("Accept Error log is : %s\n", strerror(errno));
                    close(socket_fd);
                    exit(0);
                }
                printf("received a connection from %s\n", inet_ntoa(socket_acpt.sin_addr));
                recv_len = recv(accept_clt, buf, sizeof(buf), MSG_WAITALL);
                if (recv_len == -1){
                    printf("Accept Error log is : %s\n", strerror(errno));
                    close(socket_fd);
                    exit(0);
                }
                printf("recv data : %s\n", buf);
                memset(buf, 0, sizeof(buf));
            }
        }
    }
    return 0;
}



client.c


#include
#include
#include
#include
#include
#include
#include
#include
#include

#define DEFAULTPORT         2014
#define DEFAULT_BACKLOG     20
int main(int argc ,char *argv[])
{
    struct sockaddr_in socket_addr;
    struct hostent *host;

    if (argc < 2) {
        fprintf(stderr,"Please enter what you want to send !\n");
        exit(1);
    }

    if((host=gethostbyname("127.0.0.1")) == NULL) {
        herror("gethostbyname error !");
        exit(1);
    }

    socket_addr.sin_family = AF_INET;
    socket_addr.sin_port = htons(DEFAULTPORT);
    socket_addr.sin_addr = *((struct in_addr *)host->h_addr);
    bzero(&(socket_addr.sin_zero), 8);

    int socket_fd = socket(PF_INET, SOCK_STREAM, 0);
    if (socket_fd == -1)
        printf("Socket Error log is : %s\n", strerror(errno));

    if (connect(socket_fd, (struct sockaddr *)&socket_addr, sizeof(struct sockaddr)) == -1) {
        perror("connect error !");
    }
    if (send(socket_fd, argv[1], 40, 0) == -1){
        perror("send error !");
        close(socket_fd);
    }

        return 0;
}

注意:
1 出现Transport endpoint is not connected错误,可能是由于send, recv时候,所选的socket_fd不对,应该选accept的返回的socketfd,这个新socketfd是真正的send,recv所用的socketfd,而不socket()出来的。

2 client地址配为127.0.0.1, server配为INADDR_ANY。

3 查看server启动起来没有,可以用命令netstat -na | grep 端口号(本例为2014)

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

上一篇:strace

下一篇:errno

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