socketAPI:一个最简单的服务器和对应的客户端C语言的实现

基于linux,该实例实现了服务端传了一个hello world给客户端。
socket()创建socket
bind()绑定socket到IP地址和端口
listen()服务器监听客户端的连接
connect()客户端连接到服务器
accept()应用程序接受完成3次握手的客户端连接
send() recv() write() read()机器间相互发送数据
close() 关闭socket
gethostbyname()   gethostbyaddr() V4专有
select() poll() 处理多个连接的读、写和错误状态
getsockopt()得到对应socket的选项值
setsockopt()设置对应socket的选项值

具体代码如下:

服务端部分:

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

int main(int argc, char** argv)
{
    char hello[] = "hello world";
    struct sockaddr_in sa;
    int SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

if (-1 == SocketFD) {
        perror("cannot create socket");
        exit(EXIT_FAILURE);
    }
    memset(&sa, 0, sizeof sa);

sa.sin_family = AF_INET;
    sa.sin_port = htons(2222);
    sa.sin_addr.s_addr = htonl(INADDR_ANY);

if (-1 == bind(SocketFD, (struct sockaddr*)&sa, sizeof sa)) {
        perror("bind failed");
        close(SocketFD);
        exit(EXIT_FAILURE);
    }
    if (-1 == listen(SocketFD, 10)) {
        perror("listen failed");
        close(SocketFD);
        exit(EXIT_FAILURE);
    
    }

for (;;) {
        int ConnectFD = accept(SocketFD, NULL, NULL);

if (0 > ConnectFD) {
            perror("accept failed");
            close(SocketFD);
            exit(EXIT_FAILURE);
        }

int writeSize = 0;
        size_t totalWrite = 0;
        while (totalWrite < sizeof(hello)) {
            writeSize =
                write(ConnectFD, hello + totalWrite, sizeof(hello) - totalWrite);
            if (-1 == writeSize) {
                perror("write failed");
                close(ConnectFD);
                close(SocketFD);
                exit(EXIT_FAILURE);
            }
            totalWrite += writeSize;            
        }
        if(-1==shutdown(ConnectFD,SHUT_RDWR)){
            perror("shutdown failed");
            close(ConnectFD);
            close(SocketFD);
            exit(EXIT_FAILURE);        
        }
        close(ConnectFD);    
    }
    close(SocketFD);
    return EXIT_SUCCESS;
}

客户端部分:

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

int main(int argc, char** argv)
{
    char hello[] = "hello world";
    struct sockaddr_in sa;
    int SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

if (-1 == SocketFD) {
        perror("cannot create socket");
        exit(EXIT_FAILURE);
    }
    memset(&sa, 0, sizeof sa);

sa.sin_family = AF_INET;
    sa.sin_port = htons(2222);
    res = inet_pton(AF_INET, "127.0.0.1", &sa.sin_addr);

if (-1 == connect(SocketFD, (struct sockaddr*)&sa, sizeof sa)) {
        perror("connect failed");
        close(SocketFD);
        exit(EXIT_FAILURE);
    }
    char buffer[512];
    int totalRead = 0;
    for (;;) {
        int readSize = 0;
        readSize = read(SocketFD, buffer + totalRead, sizeof(buffer) - totalRead);
        if (readSize == 0) {
            break;
        }
        else if (readSize == -1) {
            perroe("read failed");
            close(SocketFD);
            exit(EXIT_FAILURE);        
        }
        totalRead += readSize;
    }
    buffer[totalRead] = 0;
    printf("get from server:%s\n", buffer);
    
    (void)shutdown(SocketFD, SHUT_RDWR);
    close(SocketFD);
    return EXIT_SUCCESS;
}

客户端和服务端哪一边主动的调用了close函数,哪一边进入TIME_WAIT

时间: 2024-08-08 05:20:23

socketAPI:一个最简单的服务器和对应的客户端C语言的实现的相关文章

使用Django建立一个最简单的服务器

Django作为python一个灵活性很强的网络框架,在搭建服务器方面非常的方便,通过以下几步就可以建立一个属于自己的web服务器: 1.新建一个文件夹(尽量不要选择在系统盘,在搭建虚拟环境的时候会遇到很多的系统权限问题) 2.打开cmd进入当前位置 3.创建虚拟环境(后续搭建服务器都在这个目录下进行),启动虚拟环境 4.下载django工具包 5.使用django创建一个新的项目 6.创建数据库 7.运行服务器 我使用的是python3.7 -------------------------

Node.js学习笔记(1)--一个最简单的服务器请求

说明(2017-5-2 10:27:03): 1. 需要安装node,http://nodejs.cn/download/ 2. 安装完后,在cmd里输入node -v可以查看版本. 3. 代码foo.js: 注意: (1)http.createServer的两个参数,req.url而不是res.url,最后一定要res.end()! (2)server.listen不是listener.3000是端口,随便起名.后面是自己电脑的路由地址,cmd里ipconfig查看一下. 1 var http

一个epoll事件实现的高并发服务/客户端(C语言实现,服务端存储基于hashtable)

代码路径:https://github.com/prophetss/epoll-event 之前实现了一个简单高效的hashtable(点这里),之后一直想利用它再延伸一些功能,后来偶然看到一个hashtable与epoll事件的结合感觉效率很高所以自己尝试着实现了下.大体思想是将epoll接到的每一个服务请求存储到hashtable里来管理,每一个请求都可以设置独立的回调函数.具体可以先看代码,注释已经写得很详细.代码实现了一个简单实例,由于条件有限,client端我是fork了大量子进程来模

如何用Java编写一个简单的服务器和客户机

今天我要向大家介绍的是自己编写的一个比较简单的服务器和客户机程序,注意一下哦,比较简单.好了,闲话休提,砸门直入主题. 小编先从客户机和服务器的模型开始讲解.简单来说,我们实现的这种模型呢,我们每一个用户称为一个客户机,用户之间的通信之间需要一个中转,所有客户机的通信都依托于这个中转,很明显,这个中转,就是砸门的服务器了.整个模型比较简单明了,那么,接下来我们就直接进入实现阶段. 我们从实现服务器开始.Java提供了这样的一个类,ServerSocket.我们通过实例化它的方式来创建一个服务器.

用nodejs搭建一个简单的服务器

使用nodejs搭建一个简单的服务器 nodejs优点:性能高(读写文件) 数据操作能力强 官网:www.nodejs.org 验证是否安装成功:cmd命令行中输入node -v 如果显示版本号表示安装成功 [常用命令] 切换盘符 d:进入文件夹 cd nodejs返回上一级目录 cd..清屏 cls展示目录 dir复制文件名 选中右键--复制历史操作 上箭头 执行文件 node 文件名(在文件文件夹目录中)停止命令行 ctrl+c nodejs可以使用的ECMAScript.读写文件.数据库操

node搭建一个简单的服务器

搭建一个简单的服务器 1 引入http模块 两个参数 req: request 请求 res: responese 响应 module require('mod1') node_modules 文件 require('./mode1') 发布自己的模块 去 npmjs.com 去注册一个账户 在控制台中 npm login username password email npm init npm publish cnpm install express const express = requi

C#实现一个最简单的HTTP服务器

简介 本文用C#实现了一个最简单的HTTP服务器类,你可以将它嵌入到自己的项目中,或者也可以阅读代码来学习关于HTTP协议的知识. 背景 高性能的WEB应用一般都架设在强大的WEB服务器上,例如IIS, Apache, 和Tomcat.然而,HTML是非常灵活的UI标记语言,也就是说任何应用和后端服务都可以提供HTML的生成支持.在这个小小的例子中,像IIS,.Apache这样的服务器消耗的资源太大了,我们需要自己实现一个简单的HTTP服务器,将它嵌入到我们的应用中用来处理WEB请求.我们仅需要

Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器

Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器  大 | 中 | 小  [ 2011-3-30 08:40 | by 张宴 ] [文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.zyan.cc/libevent_windows/] 本文介绍了如何在 Windows 操作系统中,利用微软 Visual Studio 2005 编译生成 Libevent 2.0.10 静态链接库,并利用 L

一个基于AIO实现的简单web服务器

一下是一个基于AIO实现的简单web服务器,这是一个简单例子 /** * 一个简单的web 服务器<br/> * 通过浏览器输入localhost:8080/访问 * * @author Joeson * @since 2014/05 * */ public class AioServer implements Runnable { private AsynchronousChannelGroup asyncChannelGroup; private AsynchronousServerSoc