Linux 网络编程(TCP)

  • 客户端代码
#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<sys/socket.h>  
#include<sys/types.h>  
#include<unistd.h>  
#include<netinet/in.h>
#include <errno.h> 

int main(int argc, char** argv){

    int socketfd = 0;
    char sendbuf[1024];
    char recvbuf[1024];
    struct sockaddr_in server_addr;
    int port = 8001;
    int nbytes;

    if((socketfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == 0){
        fprintf(stderr, "socket Error:%s
a", strerror(errno));   
        exit(1);
    }

    bzero(&server_addr, sizeof(struct sockaddr_in));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(port);
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    if((connect(socketfd, &server_addr, sizeof(server_addr))) == -1){
        fprintf(stderr, "connect Error:%s
a", strerror(errno));   
        exit(1);
    }

    while(1){

        nbytes = recv(socketfd, recvbuf, sizeof(recvbuf), 0);
        recvbuf[nbytes] = '';

        printf("recv data is:%s
",recvbuf);

        printf("Input:");
        scanf("%s", sendbuf);

        send(socketfd, sendbuf, sizeof(sendbuf), MSG_NOSIGNAL);        
    }

    close(socketfd);

    exit(0);
}
  • 服务器端代码
#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<sys/socket.h>  
#include<sys/types.h>  
#include<unistd.h>  
#include<netinet/in.h>
#include <signal.h> 
#include <errno.h>

int main(int argc, char** argv){
    int old_fd,new_fd;
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
    char recvbuf[1024];
    int port = 8001;
    int len,nbytes;

    if((old_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == 0){
        fprintf(stderr, "socket Error:%s
a", strerror(errno));   
        exit(1);
    }

    bzero(&server_addr, sizeof(struct sockaddr_in));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(port);
    server_addr.sin_addr.s_addr =  htonl(INADDR_ANY);

    if((bind(old_fd, &server_addr, sizeof(server_addr))) == -1){
        fprintf(stderr, "bind Error:%s
a", strerror(errno));   
        exit(1);
    }

    //listen的第二个参数backlog为内核缓存队列长度,该队列针对每个监听套接字包含两个队列:
    //一是未完成三次握手的,二是完成三次握手的
    if(listen(old_fd, 10) == -1){
        fprintf(stderr, "listen Error:%s
a", strerror(errno));   
        exit(1);
    }

    while(1){
        len = sizeof(struct sockaddr_in);
        if ((new_fd = accept(old_fd, 
            (struct sockaddr *)&client_addr, 
            &len)) == -1) {   
            fprintf(stderr, "Accept error:%s
a", strerror(errno));   
            exit(1);   
        }


        while(1){
            if (send(new_fd, "hello fredric", strlen("hello fredric"), MSG_NOSIGNAL) == -1) {   
                fprintf(stderr, "send error:%s
", strerror(errno)); 
                exit(1);   
            }

            nbytes = recv(new_fd, recvbuf, sizeof(recvbuf), 0);
            recvbuf[nbytes] = '';

            printf("recv data is:%s
",recvbuf);
        }

        close(new_fd);
    }

    close(old_fd);
    exit(0);
}
原文地址:https://www.cnblogs.com/Fredric-2013/p/4549312.html