TCP简易通信实现

发布于:2024-08-10 ⋅ 阅读:(117) ⋅ 点赞:(0)

服务端

#include "sys/socket.h"
#include "sys/types.h"
#include "arpa/inet.h"
#include "stdio.h"
#include "unistd.h"
#include "string.h"
#include "stdlib.h"
#include "errno.h"

int main (int argc, char* argv[])
{
    if(argc != 3)
    {
        printf("Usage: %s <ip> <port>\n",argv[0]);
        exit(EXIT_FAILURE);
    }
    /*create socket*/
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(sockfd == -1)
    {
        fprintf(stderr,"socket ERROR:%s\n",strerror(errno));
        exit(EXIT_FAILURE);
    }
    /*bind socket*/
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(atoi(argv[2]));//将主机字节序转为网络字节序大端,头文件为#include "arpa/inet.h"
    //addr.sin_addr.s_addr = argv[0];//INADDR_ANY是一个预定义的常量,其值通常为0,表示套接字将绑定到本机的所有IP地址上
    int exchange = inet_aton(argv[1], &addr.sin_addr);
    if(exchange == 0)
    {
        printf("error inet_aton\n");
        exit(EXIT_FAILURE);
    }
    int ret_bind = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));
    if(ret_bind == -1)
    {
        fprintf(stderr,"bind ERROR:%s\n",strerror(errno));
        exit(EXIT_FAILURE);
    }
    /*listen socket*/
    int listen_ret = listen(sockfd,5);
    if(listen_ret == -1)
    {
        fprintf(stderr,"listen ERROR:%s\n",strerror(errno));
        exit(EXIT_FAILURE);
    }
    /* accept client */
    struct sockaddr_in client_addr;
    socklen_t len = sizeof(client_addr);
    int fd = accept(sockfd, (struct sockaddr *)&client_addr, &len);
    if(fd==-1){
        fprintf(stderr,"accept ERROR:%s\n",strerror(errno));
        exit(EXIT_FAILURE);
    }
    char buf[BUFSIZ]={0};
    while(1)
    {
        memset(buf,0,BUFSIZ);
        ssize_t bytes_read = read(fd,buf,BUFSIZ);
        if(bytes_read==-1){
            fprintf(stderr,"read ERROR:%s\n",strerror(errno));
            exit(EXIT_FAILURE);
        }
        else{
            printf("recv:%s",buf);
        }
    }
    close(fd);
    close(sockfd);
}

客户端

#include "sys/socket.h"
#include "sys/types.h"
#include "arpa/inet.h"
#include "stdio.h"
#include "unistd.h"
#include "string.h"
#include "stdlib.h"
#include "errno.h"

/*define area start*/
#define DEBUG 0
/*define area end*/

/*structure area start*/
/*structure area end*/
int main (int argc, char* argv[])
{
    if(argc != 3){
        printf("Usage: %s <ip> <port>\n",argv[0]);
        exit(EXIT_FAILURE);
    }
    /*create socket*/
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(sockfd == -1)
    {
        fprintf(stderr,"socket ERROR:%s\n",strerror(errno));
        exit(EXIT_FAILURE);
    }
    /*bind socket*/
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(atoi(argv[2]));//将主机字节序转为网络字节序大端,头文件为#include "arpa/inet.h"
#if DEBUG
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");//INADDR_ANY是一个预定义的常量,其值通常为0,表示套接字将绑定到本机的所有IP地址上
#else
    int exchange = inet_aton(argv[1], &addr.sin_addr);
#endif
    if(exchange == 0)
    {
        printf("error inet_aton\n");
        exit(EXIT_FAILURE);
    }
   int ret_connect = connect(sockfd, (struct sockaddr *)&addr, sizeof(addr));
    if( ret_connect == -1)
    {
        fprintf(stderr,"bind ERROR:%s\n",strerror(errno));
        exit(EXIT_FAILURE);
    }

    char buf[BUFSIZ]={0};
    while(1)
    {
        printf("please input:\n");
        fgets(buf,BUFSIZ,stdin);
        int ret_write = write(sockfd,buf,strlen(buf));
        if(ret_write == -1)
        {
            fprintf(stderr,"write ERROR:%s\n",strerror(errno));
            exit(EXIT_FAILURE);
        }
    }
 
    close(sockfd);
}

网站公告

今日签到

点亮在社区的每一天
去签到