unix 局域网的TCP会话

client.c

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

#define maxn 101
/**
服务器端
1>建立一个基于TCP的流套接字描述符
2>将套接字描述符绑定到本地地址和本地端口上
3>监听客户端的请求
4>通过Accept接收客户端的请求
5>发送数据/接收数据
6>关闭套接字
客户端
1>与服务器端建立链接
2> 发送数据/接收数据
3>关闭套接字
**/
int main(int  argc, char** argv)
{
    int s_socket ;
    //1>建立一个基于TCP的流套接字描述符
    if((s_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        herror("socket");
        exit(errno);
    }
    else
    {
        printf("socket create success!\n");
    }
    //端口号
    unsigned int port;
    if(argv[2]) {
        port = atoi(argv[2]);
    }
    else {
        port = 1111;
    }
    //2>将套接字描述符绑定到本地地址和本地端口上
    struct sockaddr_in  addport;
    bzero(&addport,sizeof(addport));
    addport.sin_family = AF_INET;
    //addport.sin_addr.s_addr = inet_addr(argv[1]);
    addport.sin_port = htons(port);
    if(inet_aton(argv[1], (struct in_addr*)&addport.sin_addr.s_addr) == -1)
    {
        herror("port");
        exit(errno);
    }
    else
    {
        printf("IP and port  create success!\n");
    }
    //建立链接
    if(connect(s_socket, (struct sockaddr*)&addport, sizeof(addport)) == -1)
    {
        herror("connect");
        exit(errno);
    }
    else
    {
        printf("connect   success\n");
    }
    //3>监听客户端的请求
    char buf[maxn];
    while(1)
    {
        //接收信息
        bzero(buf, maxn);
        int len;
        len = recv(s_socket, buf, maxn, 0);
        if(len > 0)
        {
            printf("服务器发来的信息是:  %s\n", buf);
        }
        else
        {
            if(len == 0)
            {
                printf("socket is closed!");
            }
            else
            {
                printf("error!");
            }
        }
        //发送信息
    loop:
        bzero(buf, maxn);
        printf("请输入要发送的信息:");
        fgets(buf, maxn, stdin);
        if(strncasecmp(buf, "exit",4) == 0)
        {
            printf("聊天中止\n");
            break;
        }
        if(strncmp(buf,"\n",1) == 0)
        {
            printf("空字符\n");
            goto loop;
        }
        int L_len = strlen(buf);
        if(buf[L_len - 1] == ‘\n‘)
        {
            len = send(s_socket, buf, L_len - 1, 0);
        }
        else
        {
            len = send(s_socket, buf, L_len, 0);
        }
        if(len > 0)
        {
            printf("send message success!\n");
        }
        else
        {
            printf("send message failure!\n");
            break;
        }
    }
    close(s_socket);
    return 0;
}

server.c

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

#define maxn 101
/**
服务器端
1>建立一个基于TCP的流套接字描述符
2>将套接字描述符绑定到本地地址和本地端口上
3>监听客户端的请求
4>通过Accept接收客户端的请求
5>发送数据/接收数据
6>关闭套接字
客户端
1>与服务器端建立链接
2> 发送数据/接收数据
3>关闭套接字
**/
int main(int  argc, char** argv)
{
    int s_socket, sock_port ;
    //1>建立一个基于TCP的流套接字描述符
    if((s_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        herror("socket");
        exit(errno);
    }
    else
    {
        printf("socket create success!\n");
    }
    //端口号
    unsigned int port;
    if(argv[2]) {
        port = atoi(argv[2]);
    }
    else {
        port = 1111;
    }
    if(argv[3])
    {
        sock_port = atoi(argv[3]);
    }
    else
    {
        sock_port = 3;
    }
    //2>将套接字描述符绑定到本地地址和本地端口上
    struct sockaddr_in  c_addport, s_addport;
    bzero(&s_addport, sizeof(s_addport));
    s_addport.sin_family = AF_INET;
    //s_addport.sin_addr.s_addr = inet_addr(argv[1]);
    s_addport.sin_port = htons(port);
    if(argv[1])
    {
        s_addport.sin_addr.s_addr = inet_addr(argv[1]);
    }
    else
    {
        s_addport.sin_addr.s_addr = INADDR_ANY;
    }
    if((bind(s_socket, (struct sockaddr*) &s_addport, sizeof(struct sockaddr))) == -1) {
        perror("bind");
        exit(errno);
    }
    else {
        printf("bind success!\n");
    }
    //3>监听客户端的请求
    if(listen(s_socket, sock_port) == -1)
    {
        herror("listen");
        exit(errno);
    }
    else
    {
        printf("server is listening!\n");
    }
    while(1)
    {
        int  flag;
        socklen_t len;
        len = sizeof(struct sockaddr);
        flag = accept(s_socket, (struct sockaddr*)&c_addport, &len);
        if(flag == -1)
        {
            herror("accept");
            exit(errno);
        }
        else
        {
            printf("Accept success!\n");
            printf("现在监听的客户端IP是 :%s端口是%d\n", inet_ntoa(c_addport.sin_addr), ntohl(c_addport.sin_port));
        }
        char buf[maxn];
        while(1)
        {
            //发送消息
        loop:
            bzero(buf, maxn);
            printf("请输入要发送的信息:");
            fgets(buf, maxn, stdin);
            if(strncasecmp(buf, "exit",4) == 0)
            {
                printf("chatting ending !\n");
                break;
            }
            if(strcmp(buf, "\n") == 0)
            {
                printf("空字符\n");
                goto loop;
            }
            int L_len = strlen(buf);
            int Index ;
            if(buf[L_len - 1] == ‘\n‘)
            {
                Index = send(flag, buf, L_len - 1, 0);
            }
            else
            {
                Index = send(flag, buf, L_len, 0);
            }
            if(Index == -1)
            {
                printf("send message failure!");
            }
            else
            {
                printf("send message success!\n");
            }
            //接收消息
            bzero(buf, maxn);
            int LL;
            LL = recv(flag, buf, maxn, 0);
            if(LL > 0)
            {
                printf("从客户端接收的信息是%s\n", buf);
            }
            else
            {
                if(LL < 0)
                {
                    printf("Receive message failure!\n");
                }
                else
                {
                    printf("客户端退出,聊天中止\n");
                }
                break;
            }
        }
        close(flag);
        char ch[10];
        int  isok = 1;
        printf("是否结束进程?Y->是:N->否");
        bzero(ch, 10);
        fgets(ch, 10, stdin);
        if(strncasecmp(buf,"Y",1)== 0)
        {
            printf("结束进程");
            isok = 0;
            break;
        }
        if(!isok) break;
    }
    close(s_socket);
    return 0;
}
时间: 2024-08-07 04:10:04

unix 局域网的TCP会话的相关文章

TCP会话劫持_转

前言通常,大家所说的入侵,都是针对一台主机,在获得管理员权限后,就很是得意:其实,真正的入侵是占领整个内部网络.针对内部网络的攻击方法比较多,但比较有效的方法非ARP欺骗.DNS欺骗莫属了.但是,不管使用什么技术,无非都是抓取目标的数据包,然后分析出敏感数据.如果目标内部采用的是共享式网络(采用HUB集线器连网),那只需要把网卡设置为"混杂模式",挂上嗅探器(Sniffer),就能简听到你想得到的数据.如果是交换式网络(采用交换机连网),这样方法就行不通了,因为对于嗅探器,有三种网络环

Nginx 中 fastcgi_pass 监听端口 unix socket和tcp socket差

Nginx 中 fastcgi_pass 监听端口 unix socket和tcp socket差别 Nginx连接fastcgi的方式有2种:unix domain socket和TCP,Unix domain socket 或者 IPC socket是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信.与管道相比,Unix domain sockets 既可以使用字节流和数据队列,而管道通信则只能通过字节流.Unix domain sockets的接口和Internet socke

unix环境编程 tcp通信

TCP通信的过程为: 一. 服务器端: 1.socket(int domain,int type,int protocol):建立套接字: 2 .bind(int sockid,struct sockaddr *addrp,socklen_t addrlen):绑定端口和地址信息: 3.listen(int sockid,int qsize):监听套接字; 4.fd=accept(int sockid,struct sockaddr *callerid,socklen_t *addrlenp):

nginx 和 php-fpm 通信使用unix socket还是TCP,及其配置

前言 nginx和fastcgi的通信方式有两种,一种是TCP的方式,一种是unix socke方式.两种方式各有优缺点,这里先给出两种的配置方法,然后再对性能.安全性等做出总结. TCP是使用TCP端口连接127.0.0.1:9000 Socket是使用unix domain socket连接套接字/dev/shm/php-cgi.sock(很多教程使用路径/tmp,而路径/dev/shm是个tmpfs,速度比磁盘快得多),在服务器压力不大的情况下,tcp和socket差别不大,但在压力比较满

【转】nginx 和 php-fpm 通信使用unix socket还是TCP,及其配置

原文: http://blog.csdn.net/pcyph/article/details/46513521 -------------------------------------------------------------------------------------------------------------------- 前言 nginx和fastcgi的通信方式有两种,一种是TCP的方式,一种是unix socke方式.两种方式各有优缺点,这里先给出两种的配置方法,然后再

第5章-unix网络编程 TCP/服务端程序示例

这一章主要是完成一个完整的tcp客户/服务器程序.通过一很简单的例子.弄清客户和服务器如何启动,如何终止,发生了某些错误会发生什么.这些事很重要的 客户端代码 #include "unp.h" //static void str_cli1(FILE*fp,int sockfd); int main(int argc,char *argv[]) { int sockfd; struct sockaddr_in servaddr; sockfd=Socket(AF_INET,SOCK_ST

UNIX网络编程笔记(4)—TCP客户/服务器程序示例

TCP客户/服务器程序示例 这一章信息量开始大起来了,粗略来看它实现了简单的TCP客户/服务器程序,里面也有一些费解的细节. 1.概述 完整的TCP客户/服务器程序示例.这个简单的例子将执行如下步骤的一个回射服务器(这里的回射服务器就是服务简单的把客户端发送的消息返回给客户): 1)客户从标准输入读入一行文本,并写给服务器 2)服务器从网络输入读入这行文本,并回射给客户 3)客户从网络输入读入这行回射文本,并显示在标准输出上 这样实际上就构成了一个全双工的TCP连接. 本章就围绕了这个简单的TC

UNIX网络编程入门——TCP客户/服务器程序详解

前言 最近刚开始看APUE和UNP来学习socket套接字编程,因为网络这方面我还没接触过,要等到下学期才上计算机网络这门课,所以我就找了本教材啃了一两天,也算是入了个门. 至于APUE和UNP这两本书,书是好书,网上也说这书是给进入unix网络编程领域初学者的圣经,这个不可置否,但这个初学者,我认为指的是接受过完整计算机本科教育的研究生初学者,需要具有完整计算机系统,体系结构,网络基础知识.基础没打好就上来啃书反而会适得其反,不过对于我来说也没什么关系,因为基础课也都上得差不多了,而且如果书读

网络分流器-TCP报文重组和会话规则-网络分流器

戎腾网络网络分流器又名核心网采集器,又分为固网采集器和移动信令采集器两大类!网络分流器是整个网络安全前端网络监控的重要基础装备! 我们在网络安全当中经常听到旁路,镜像,流量采集,DPI深度数据包检测,五元组过滤等相关词汇,今天网络分流器为大家讲讲TCP报文重组和会话规则! 网络分流器高密度兼顾10G和100G 一.基本概念 四元组:源IP地址.目的IP地址.源端口.目的端口. 五元组:源IP地址.目的IP地址.协议号.源端口.目的端口. 六元组:源MAC地址.源IP地址.源端口号.目的MAC地址