TCP简易通信实现

服务端

#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);
}
/*test */
/*
```bash 1
    gcc TCP_connect.c -o TCP_connect
    ./TCP_connect
```bash 2
    nc 127.0.0.1 8080
    hello world
*/
# 客户端
#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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值