linux 下tcp的发送接收端

TCP linux


#include <stdio.h>  
#include <stdlib.h>  
#include <strings.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
#include <memory.h>  
#include <unistd.h>  
//#include <linux/in.h>  
#include <netinet/in.h>  
//#include <linux/inet_diag.h>  
#include <arpa/inet.h>  
  
#include <signal.h>  
  


  
#define PORT    11910   //定义通信端口  
#define BACKLOG 5         
#define buflen  1024  
  
void process_conn_server(int s);  
void sig_pipe(int signo);  
  
int ss,sc;  //ss为服务器socket描述符,sc为某一客户端通信socket描述符  
  
int main(int argc,char *argv[])  
{  
  
    struct sockaddr_in server_addr; //存储服务器端socket地址结构  
    struct sockaddr_in client_addr; //存储客户端 socket地址结构  
  
    int err;    //返回值  
    pid_t pid;  //分叉进行的ID  
  
    /*****************socket()***************/  
    ss = socket(AF_INET,SOCK_STREAM,0);  
    if(ss<0)  
    {  
        printf("server : server socket create error\n");  
        return -1;  
    }    
    sighandler_t ret;  
    ret = signal(SIGTSTP,sig_pipe);  
    if(SIG_ERR == ret)  
    {  
        printf("信号挂接失败\n");  
        return -1;  
    }  
    else  
        printf("信号挂接成功\n");  
  
  
    /******************bind()****************/  
    //初始化地址结构  
    memset(&server_addr,0,sizeof(server_addr));  
    server_addr.sin_family = AF_INET;           //协议族  
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);   //本地地址  
    server_addr.sin_port = htons(PORT);  
  
    err = bind(ss,(struct sockaddr *)&server_addr,sizeof(sockaddr));  
    if(err<0)  
    {  
        printf("server : bind error\n");  
        return -1;  
    }  
  
    /*****************listen()***************/  
    err = listen(ss,BACKLOG);   //设置监听的队列大小  
    if(err < 0)  
    {  
        printf("server : listen error\n");  
        return -1;  
    }  
  
    /****************accept()***************/  


  
    for(;;)  
    {  
        socklen_t addrlen = sizeof(client_addr);  
        //accept返回客户端套接字描述符  
        sc = accept(ss,(struct sockaddr *)&client_addr,&addrlen);  //注,此处为了获取返回值使用 指针做参数  
        if(sc < 0)  //出错  
        {  
            continue;   //结束此次循环  
        }  
        else  
        {  
            printf("server : connected\n");  
        }  
  
        //创建一个子线程,用于与客户端通信  
        pid = fork();  
        //fork 调用说明:子进程返回 0 ;父进程返回子进程 ID  
        if(pid == 0)        //子进程,与客户端通信  
        {  
            close(ss);  
            process_conn_server(sc);  
        }  
        else  
        {  
            close(sc);  
        }  
    }  
}  


  
//通过套接字 s 与客户端进行通信  
void process_conn_server(int s)  
{  
    ssize_t size = 0;  
    char buffer[buflen];  //定义数据缓冲区  
    for(;;)  
    {  
        //等待读  
        for(size = 0;size == 0 ;size = read(s,buffer,buflen));  
        //输出从客户端接收到的数据  
        printf("%s",buffer);  
  
        //结束处理  
        if(strcmp(buffer,"quit") == 0)  
        {  
            close(s);   //成功返回0,失败返回-1  
            return ;  
        }  
        sprintf(buffer,"%d bytes altogether\n",size);  
        write(s,buffer,strlen(buffer)+1);  
    }  
}  
void sig_pipe(int signo)  
{  
    printf("catch a signal\n");  
    if(signo == SIGTSTP)  
    {  
        printf("接收到 SIGTSTP 信号\n");  
        int ret1 = close(ss);  
        int ret2 = close(sc);  
        int ret = ret1>ret2?ret1:ret2;  
        if(ret == 0)  
            printf("成功 : 关闭套接字\n");  
        else if(ret ==-1 )  
            printf("失败 : 未关闭套接字\n");  
  
        exit(1);  
    }  
}  






TCP


[cpp] view plain copy
#include <stdio.h>  
#include <strings.h>  
#include <unistd.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
//#include <linux/in.h>  
#include <stdlib.h>  
#include <memory.h>  
#include <arpa/inet.h>  
#include <netinet/in.h>  
  
#include <signal.h> //添加信号处理  防止向已断开的连接通信  
  


  
  
#define PORT    11910  
#define Buflen  1024  
  
void process_conn_client(int s);  
void sig_pipe(int signo);    //用户注册的信号函数,接收的是信号值  
  
int s;  //全局变量 , 存储套接字描述符  
  
int main(int argc,char *argv[])  
{  
  
    sockaddr_in server_addr;  
    int err;  
    sighandler_t ret;  
    char server_ip[50] = "";  
    /********************socket()*********************/  
    s= socket(AF_INET,SOCK_STREAM,0);  
    if(s<0)  
    {  
        printf("client : create socket error\n");  
        return 1;  
    }  
  
    //信号处理函数  SIGINT 是当用户按一个 Ctrl-C 建时发送的信号  
    ret = signal(SIGTSTP,sig_pipe);  
    if(SIG_ERR == ret)  
    {  
        printf("信号挂接失败\n");  
        return -1;  
    }  
    else  
        printf("信号挂接成功\n") ;  
  
  
    /*******************connect()*********************/  
    //设置服务器地址结构,准备连接到服务器  
    memset(&server_addr,0,sizeof(server_addr));  
    server_addr.sin_family = AF_INET;  
    server_addr.sin_port = htons(PORT);  
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);  
  
    /*将用户数入对额字符串类型的IP格式转化为整型数据*/  
    //inet_pton(AF_INET,argv[1],&server_addr.sin_addr.s_addr);  
    printf("please input server ip address : \n");  
    read(0,server_ip,50);  
    //err = inet_pton(AF_INET,server_ip,&server_addr.sin_addr.s_addr);  
    server_addr.sin_addr.s_addr = inet_addr(server_ip);  
  
    err = connect(s,(struct sockaddr *)&server_addr,sizeof(sockaddr));  
    if(err == 0)  
    {  
        printf("client : connect to server\n");  
    }  
    else  
    {  
        printf("client : connect error\n");  
        return -1;  
    }  
    //与服务器端进行通信  
    process_conn_client(s);  
    close(s);  
  
}  
void process_conn_client(int s)  
{  
  
    ssize_t size = 0;  
    char buffer[Buflen];  
  
    for(;;)  
    {  
        memset(buffer,'\0',Buflen);  
        /*从标准输入中读取数据放到缓冲区buffer中*/  
        size = read(0,buffer,Buflen);   // 0,被默认的分配到标准输入  1,标准输出  2,error  
        if(size >  0)  
        {  
            //当向服务器发送 “quit” 命令时,服务器首先断开连接  
            write(s,buffer,strlen(buffer)+1);   //向服务器端写  
  
            //等待读取到数据  
            for(size = 0 ; size == 0 ; size = read(s,buffer,Buflen) );  
  
            write(1,buffer,strlen(buffer)+1);   //向标准输出写  
        }  
    }  
}  
  
void sig_pipe(int signo)    //传入套接字描述符  
{  
    printf("Catch a signal\n");  
    if(signo == SIGTSTP)  
    {  
  
        printf("接收到 SIGTSTP 信号\n");  
        int ret = close(s);  
        if(ret == 0)  
            printf("成功 : 关闭套接字\n");  
        else if(ret ==-1 )  
            printf("失败 : 未关闭套接字\n");  
        exit(1);  
    }  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值