linux下运行的socket_tcp

服务端:

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

#define SRVIP "127.0.0.1"
#define SRVPORT 10005
#define MAX_NUM 80

/*********************
TCP socket通信
服务器端流程如下:
1.创建serverSocket
2.初始化 serverAddr(服务器地址)
3.将socket和serverAddr 绑定 bind
4.开始监听 listen
5.进入while循环,不断的accept接入的客户端socket,进行读写操作write和read
6.关闭serverSocket
**********************/
int main()
{
    // 如果发生错误,函数返回值为-1。 否则,函数会返回一个代表新分配的描述符的整数
    int serverSock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(serverSock < 0)
    {
        printf("socket creation failed\n");
        exit(-1);
    }
    printf("socket create successfully.\n");

    struct sockaddr_in serverAddr;
    memset(&serverAddr,0,sizeof(serverAddr));
    serverAddr.sin_family=AF_INET;
    serverAddr.sin_port = htons((u_short)SRVPORT);
    serverAddr.sin_addr.s_addr = inet_addr(SRVIP);

    // bind() 将一个socket绑定到指定的IP和端口上,socket只接受绑定IP和端口的数据
    if(bind(serverSock, (struct sockaddr*)&serverAddr, sizeof(struct sockaddr))==-1)
    {
        printf("Bind error.IP[%s], Port[%d]\n", SRVIP, serverAddr.sin_port);
        exit(-1);
    }
    printf("Bind successful.IP[%s], Port[%d]\n", SRVIP, serverAddr.sin_port);

    // 当socket和一个地址绑定之后,listen()函数会开始监听可能的连接请求
    if(listen(serverSock,10)==-1)
    {
        printf("Listen error!\n");
    }
    printf("Listening on port[%d]\n", serverAddr.sin_port);

    char recvBuf[MAX_NUM]={0};
    char sendBuf[MAX_NUM]={0};
    while(1)
    {
        struct sockaddr clientAddr;
        int size = sizeof(clientAddr);

        //阻塞,直到有新tcp客户端连接
        int clientSock = accept(serverSock, &clientAddr, &size);
        printf("***SYS***    New client touched.\n");
        while(1)
        {
            //一直接收客户端socket的send操作
            if(recv(clientSock, recvBuf, MAX_NUM, 0) == -1)
            {
                printf("read error.\n");
            }
            else
            {
                printf("receiv from client:%s\n",recvBuf);
            }
            if(strcmp(recvBuf,"Quit") == 0 || strcmp(recvBuf,"quit") == 0)
            {
                strcpy(sendBuf, "Goodbye,my dear client!");
            }
            else
            {
                strcpy(sendBuf, "Hello Client.");
            }

            // 向客户端发送套接字
            if(send(clientSock, sendBuf , sizeof(sendBuf), MSG_NOSIGNAL) == -1)
            {
                printf("Send error!\n");
            }
            else
            {
                printf("Send to client:%s\n", sendBuf);
            }
            if(strcmp(recvBuf, "Quit") == 0 || strcmp(recvBuf, "quit") == 0)
            {
                break;
            }
            memset(recvBuf, 0, sizeof(recvBuf));
            memset(sendBuf, 0, sizeof(sendBuf));
        }
        close(clientSock);
    }

    //关闭监听socket
    close(serverSock);
    return 0;
}

客户端:

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

#define CLTIP "127.0.0.1"
#define SRVPORT 10005
#define MAX_NUM 80

/**************************
客户端流程:

1.创建clientSocket
2.初始化 serverAddr
3.链接到服务器 connect
4.利用send和recv进行读写操作
5.关闭clientSocket
**************************/
int main()
{
    // 延迟1s
    //sleep(1000);

    // socket() 为通讯创建一个端点,为套接字返回一个文件描述符
    int clientsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(clientsock < 0)
    {
        printf("socket creation failed\n");
        exit(-1);
    }
    printf("socket create successfully.\n");

    struct sockaddr_in clientAddr;
    clientAddr.sin_family = AF_INET;
    clientAddr.sin_port = htons((u_short)SRVPORT);
    clientAddr.sin_addr.s_addr = inet_addr(CLTIP);

    if(connect(clientsock, (struct sockaddr*)&clientAddr, sizeof(struct sockaddr)) < 0)
    {
        printf("Connect error.IP[%s], port[%d]\n", CLTIP, clientAddr.sin_port);
        exit(-1);
    }
    printf("Connect to IP[%s], port[%d]\n", CLTIP, clientAddr.sin_port);

    char sendBuf[MAX_NUM]={0};
    char recvBuf[MAX_NUM]={0};
    while(gets(sendBuf) != ‘\0‘)
    {
        if(send(clientsock, sendBuf, strlen(sendBuf) + sizeof(char), 0) == -1)
        {
            printf("send error!\n");
        }
        printf("send to server:%s\n", sendBuf);
        memset(sendBuf, 0, sizeof(sendBuf));

        if(recv(clientsock, recvBuf, MAX_NUM, 0) == -1)
        {
            printf("rev error!\n");
        }
        printf("receive from server:%s\n",recvBuf);
        if(strcmp(recvBuf,"Goodbye,my dear client!")==0)
        {
            break;
        }
        memset(recvBuf, 0, sizeof(recvBuf));
    }
    close(clientsock);
    return 0;
}

附上makefile

server_tcp:server_tcp.o
        gcc -o server_tcp server_tcp.o
server_tcp.o:server_tcp.c
        gcc -c server_tcp.c
clean:
        rm -rf  server_tcp server_tcp.o
client_tcp:client_tcp.o
        gcc client_tcp.o -o client_tcp
client_tcp.o:client_tcp.c
        gcc -c client_tcp.c
clean:
        rm -rf client_tcp client_tcp.o

服务端运行情况:

客户端运行情况:

2014-09-01 10:42:47

时间: 2024-11-08 22:28:19

linux下运行的socket_tcp的相关文章

Demo+在Linux下运行(CentOS7+dotnetcore sdk)

来份ASP.NET Core尝尝 0x01.前言 学习ASP.NET Core也有一段时间了,虽说很多内容知识点还是处于一知半解的状态,但是基本的,还是 略懂一二.如果有错误,还望见谅. 本文还是和之前一样,Demo+在Linux下运行(CentOS7+dotnetcore sdk) 开发环境:win10+vs2015+sqlserver2014 0x02.demo 新建一个ASP.NET Core Web Application项目--Catcher.EasyDemo.Website 干掉Co

windows下编写的Shell脚本在Linux下运行错误的解决方法

出现这种错误的原因:CR/LF问题,在dos/window下按一次回车键实际上输入的是“回车(CR)”和“换行(LF)”,而Linux/unix下按一次回车键只输入“换行(LF)”,所以修改的sh文件在每行都会多了一个CR,所以Linux下运行时就会报错找不到命令. 两种解决方法: 1.将格式转换为UNIX,“编辑->格式转换(CR/LF)->UNIX”,这样Linux下就能按unix的格式保存文件 2.在vim中,输入:set ff=unix,然后:wq,同样也是转换成unix的格式 cat

【JMeter】JMeter在linux下运行

[JMeter]JMeter在linux下运行 之前在用JMeter做性能测试时基本都用自己的笔记本电脑. 考虑到网络传输和占用系统资源情况时进行了以下分析: 1 在笔记本上,开始-cmd "ping 服务器",得到传输时间.在某linux机器上"ping 服务器"得到传输时间,两个时间相差无几,认为不会影响测试结果 2 一般我用来测试的linux测试机和笔记本电脑,都是4核 8G. 可是!今天公司网络很不好!严重影响了我的测试.忍无可忍,干脆在linux上测试算啦

Linux下运行java项目

最近初步接触了linux,感觉很有新鲜感.之前在windows下干过的事情也便想到在linux环境下实现一下.正好手头在编java,就想既然java可以在windows的DOS操作下运行,是不是也可以在linux的terminal下编译执行呢?好奇心是最好的老师,网上丰富的资源帮助我很快的实现了这一操作.具体实现过程如下: 安装JDK 要编译执行java代码,首先需要有支持java的系统程序,所谓的jdk,java development kit就是干这个用的.无论是在windows还是Linu

Java项目打包在CMD或者Linux下运行

1.在CMD下运行 在eclipse中将项目export成jar包,然后用压缩软件解压 解压后,在CMD中进入项目根目录下,运行程序: Oracle2Redis-jar>java -cp .\lib\*; oracle.xxx.xx.cn.ReadOracle2Redis 2.在Linux中运行 把解压后的文件夹上传到Linux系统中,在项目根目录中运行: java  -cp ./lib/*: oracle.xxx.xx.cn.ReadOracle2Redis (跟Windows下路径分隔符(\

JMeter在linux下运行

之前在用JMeter做性能测试时基本都用自己的笔记本电脑. 考虑到网络传输和占用系统资源情况时进行了以下分析: 1 在笔记本上,开始-cmd "ping 服务器",得到传输时间.在某linux机器上"ping 服务器"得到传输时间,两个时间相差无几,认为不会影响测试结果 2 一般我用来测试的linux测试机和笔记本电脑,都是4核 8G. 可是!今天公司网络很不好!严重影响了我的测试.忍无可忍,干脆在linux上测试算啦. 只需一行命令:sh jmeter.sh -n

在Linux下运行C语言程序

市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核.桌面环境和各种常用的必备工具,国内使用较多的是Ubuntu(乌班图).CentOS.Deepin(深度Linux).本教程以Deepin为例来讲述如何编译C程序. Gedit Gedit是一个简单实用的文本编辑器,拥有漂亮的界面,支持语法高亮,比 Vim 更易上手.本教程将Gedit作为C代码编辑器. Gedit的安装: sudo apt-add-repository ppa:ubuntu-on-rails/ppa

linux下运行jmeter脚本

1. win下生成测试计划   2. 上传至linux下 3.运行测试计划   sh jmeter.sh -n -t second_login.jmx -l res.jtl 错误1: solution: 删除原linux系统自带的jdk版本传入新的jdk版本,并将新版本的jdk路径配置在环境变量里面 source /etc/profile 错误2: 产生该错误的原因,目前有两种情况: 情况1,低版本的JMeter运行高版本的测试计划(测试计划是在高版本的JMeter上编制的).解决方法:使用相同

将Eclipse中的java项目转移到Linux下运行

有些java项目考虑到性能的需求或者需要调用shell脚本等,需要在Linux系统下运行.完成Eclipse中的java项目到Linux系统下迁移需要一些操作: 1.将Eclipse下的java项目源码打包成jar,可以有两种方式,但是建议第一种有利于管理关联的jar包. 方法1:使用maven 1)保证该java项目是一个maven项目,关联的jar包都位于lib下并已引入到.classpath和pom.xml中. 2)右键项目->Debug->Debug Configurations,在B