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\n\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\n\a", strerror(errno));   
        exit(1);
    }

    while(1){

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

        printf("recv data is:%s\n",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\n\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\n\a", strerror(errno));   
        exit(1);
    }

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


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

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

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

        close(new_fd);
    }

    close(old_fd);
    exit(0);
}

转载于:https://www.cnblogs.com/Fredric-2013/p/4549312.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值