Tcp简单通讯

头文件

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

Server端

1.建立通信socket接口

struct sockaddr_in sin;//套接字
int sock;//文件描述符

if((sock=socket(AF_INET,SOCK_DGRAM,0))==-1){
    perror("socket");
    exit(1);
}//建立通讯接口

memset(&sin,0,sizeof(sin));//重置套接字

sin.family=AF_INET;//ipv4协议
sin.sin_addr.s_addr=htonl("192.168.0.0");//服务端ip地址
sin.port=htons(5001);//服务端端口

2.对socket定位bind绑定

if(bind(sock,(struct sockaddr*)&sin,sizeof(sin))<0){
    perror("bind");
    exit(1);
}

3.监听(主动套接字变被动套接字)

if(listen(sock,BACKLOG)<0){
    perro("listen");
    exit(1);
}//BACKLOG 最大连接数,包括未连接【tcp三次握手正在建立连接+已经连接】

4.阻塞,等待连接

int newsock;
newsock=accept(sock,NULL,NULL);//(addr,addrlen)参数为NULL则为所有客户端都提供服务
if(newsock<0){
    perror("accept");
    exit(1);
}//返回已完成连接,已完成连接队列为空,进程被投入睡眠

5.接收数据

char buff[BUFSIZ];
int ret;
while(1){
    memset(&buff,0,sizeof(buff));
    do{
        ret=read(newsock,buff,BUFSIZE-1);
        }
    }while(ret<0 && EINTR == errno);//read中断或错误时返回-1,错误代码存入EINTR

    if(ret<0){
        perror("read");
        exit(1);
    }

    if(ret=0){
    break;
    }//read遇到文件尾返回0
    if(ret!=1){
        printf("massage:%s",buff);
    //回传客户端
    if(write(newsock,buff,strlen(buff)<0){
        perror(write);
        exit(1);
    }

6.关闭套接字

close(newsock);
close(sock);

Client端

1.建立通信socket接口

struct sockaddr_in sin;
int sock;

if((sock = socket(AF_INET,SOCK_DGRAM,0))==-1){
		perror("socket");
		exit(1);
	}

memset(&sin,0,sizeof(sin));
sin.sin_family=AF_INET;
sin.sin_port=htons(SERV_PORT);
if(inet_pton(AF_INET,"192.168.0.0",(void*)& sin.sin_addr.s_addr)!=1){
   perror("inet_pton");
   exit(1);
}//将IP地址从字符串格式转换成网络地址格式

2.与socket建立连接

    if(connect(sock,(struct sockaddr*)&sin,sizeof(sin))<0){
        perror("connect");
        exit(1);
    }

3.发送数据

char recvbuff[BUFSIZ];
char sendbuff[BUFSIZ];
int ret;
while(1){
     memset(&recvbuff,0,sizeof(buff));
     memset(&sendbuff,0,sizeof(buff));    
     if(fgets(sendbuff,sizeof(sendbuff)-1,stdin)==NULL)
        continue;
     do{
        ret = write(sock,sendbuff,sizeof(sendbuff)-1);//write遇到了中断,返回-1,同时置errno为EINTR
     }while(ret < 0 && EINTR == errno);

    if(ret == 0){
        perror(write);
        break;
    }//write返回0,表示出错,无法写入
    //接收回传数据
    if(read(sock,recvbuff,strlen(recvbuff))<0){
        perror(read);
        exit(1);
    }
    printf("send:%s",recvbuff);
}

4.关闭套接字

close(sock);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值