socket網絡編程

Makefile文件

socket_ser socket_cl:socket_ser.c socket_cl.c
        gcc socket_ser.c -o socket_ser
        gcc socket_cl.c -o socket_cl
#.PHONY:clean
clean:
        -rm -f socket_ser  socket_cl

1、阻塞方式

服務器:

#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <sys/ioctl.h>

#define MAX_CONN 10

void accept_handle(int connfd, struct sockaddr_in peeraddr);

int main(int argc, const char *argv[])
{
    int                 sockfd, connfd;
    struct sockaddr_in  seraddr, peeraddr;
    socklen_t           addrlen;
    int                 mode = 1;


    if (argc != 2) {
        printf("Usage: %s <port>\n", argv[0]);
        return -1;
    }
    //sockfd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);//異步
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        printf("socket: %s\n", strerror(errno));
        return -1;
    }

    seraddr.sin_family = AF_INET;
    seraddr.sin_port = ntohs(atoi(argv[1]));
    seraddr.sin_addr.s_addr = htonl(INADDR_ANY);

    if (bind(sockfd, (struct sockaddr *)&seraddr, sizeof(struct sockaddr))) {
        printf("bind: %s\n", strerror(errno));
        return -1;
    }

    if (listen(sockfd, MAX_CONN) < 0) {
        printf("listen: %s\n", strerror(errno));
        return -1;
    }

    addrlen = sizeof(struct sockaddr);
    for (;;) {
        connfd = accept(sockfd, (struct sockaddr *)(&peeraddr), &addrlen);
        if (connfd < 0) {
            printf("accept: %s\n", strerror(errno));
            continue;
        }
        accept_handle(connfd, peeraddr);
    }
    return 0;
}

void accept_handle(int connfd, struct sockaddr_in peeraddr)
{
    char            buf[32] = "Hello, welcome to server!";
    char            buf_h[255];
    char            recvbuf[255];
    int             rntCode = 0;
    int             rntCodel = 0;
    printf("Receive request from %s, port %d\n",
             inet_ntop(AF_INET, &peeraddr.sin_addr, buf, sizeof(buf)),
             ntohs(peeraddr.sin_port));
    while(1)
        {
        bzero(buf_h,sizeof(buf_h));
        read(0,buf_h,sizeof(buf_h));// 會發生阻塞
                rntCodel = send(connfd, buf_h, sizeof(buf_h), 0);
                printf("server 1\n");
                if ( rntCodel> 0) {
            printf("send info: %s\n", buf_h);
        }
                memset(recvbuf, 0, sizeof(recvbuf));
                rntCode = recv(connfd, recvbuf, sizeof(recvbuf), 0);
                //rntCode = read(connfd, recvbuf, sizeof(recvbuf));
                if(rntCode > 0)
                {
                   printf("From client: %s\n", recvbuf);
                }
        }
    close(connfd);
    return;
}

客戶端:

#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <sys/ioctl.h>

int main(int argc, const char *argv[])
{
    int                 sockfd;
    struct sockaddr_in  seraddr;
    char                recvbuf[255];
    int                 rntCode = 0;
    char                buf_h[255];
    int                 rntCodel = 0;
    int                 mode = 1;
    if (argc != 3) {
        printf("Usage: %s <ip> <port>\n", argv[0]);
        return -1;
    }
    if (inet_pton(AF_INET, argv[1], &seraddr.sin_addr) < 0) {
        printf("inet_pton: %s\n", strerror(errno));
        return -1;
    }

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        printf("socket: %s\n", strerror(errno));
        return -1;
    }

    seraddr.sin_family = AF_INET;
    seraddr.sin_port = htons(atoi(argv[2]));
        if (connect(sockfd, (struct sockaddr *)(&seraddr),
        sizeof(struct sockaddr)) < 0) {
        printf("connect: %s\n", strerror(errno));
        return -1;
    }

    while(1)
    {
        memset(recvbuf, 0, sizeof(recvbuf));
                //rntCode = recv(sockfd, recvbuf, sizeof(recvbuf), 0);
                rntCode = read(sockfd, recvbuf, sizeof(recvbuf));
                if(rntCode > 0)
                {
                   printf("From server: %s\n", recvbuf);
                }
                bzero(buf_h,sizeof(buf_h));
        read(0,buf_h,sizeof(buf_h));  
            rntCodel = send(sockfd, buf_h, sizeof(buf_h), 0);
            if (rntCodel > 0) {
                printf("send info: %s\n", buf_h);
        }
    }
        close(sockfd);
    return 0;
}

2、非阻塞方式

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章