linux 套接字编程入门--Hello World

  下述代码是linux套接字编程的入门代码.分为服务端和客户端源码.

  服务端代码的主要流程是绑定ip地址和端口号建立套接字,等待客户端发起访问.接受客户端请求之后,向客户端发送字符串"hello world",关闭套接字,结束程序.

  客户端代码的主要流程是向服务端对应的套接字发起请求,读取服务端发送的数据,并且打印出来.

  代码已经详细注释,更多细节不再赘述.

server.cpp

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

int main(){
    //创建套接字
    /*
     * AF_INET is an address family that is used to designate
     * the type of addresses that your socket can communicate
     * with (in this case, Internet Protocol v4 addresses).
     * When you create a socket, you have to specify its address family,
     * and then you can only use addresses of that type with the socket.
     * The Linux kernel, for example, supports 29 other address families
     * such as UNIX (AF_UNIX) sockets and IPX (AF_IPX), and also communications with IRDA
     * and Bluetooth      * (AF_IRDA and AF_BLUETOOTH, but it is doubtful you‘ll use these at such a low level).
     * For the most part, sticking with AF_INET for socket programming over
     * a network is the safest option.
     * There is also AF_INET6 for Internet Protocol v6 addresses
     */
    /*
     * SOCK_STREAM
     * Provides sequenced, reliable, two-way, connection-
     * based byte streams.  An out-of-band data transmission
     * mechanism may be supported.
     */
    //IPPROTO_TCP 采用TCP协议
    int serv_sock =socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    //将套接字和IP 端口号进行绑定
    struct sockaddr_in serv_addr;
    //初始化结构体serv_addr
    memset(&serv_addr,0,sizeof(serv_addr));
    //使用ipv4地址
    serv_addr.sin_family=AF_INET;
    //设置ip地址
    serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
    //设置端口号
    serv_addr.sin_port =htons(2896);
    //将套接字和结构体进行绑定 结构体中存储了套接字的协议 端口号  以及ip地址
    bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
    //进入监听状态,等待用户发起请求
    //进入被动监听状态,套接字一直处于睡眠状态,直至客户端发起请求才会被重新唤醒
    listen(serv_sock,20);
    //客户端请求对应的套接字结构体
    struct sockaddr_in client_addr;
    //客户端请求套接字结构体的大小
    socklen_t  client_addr_size =sizeof(client_addr);
    //用于接受客户端的请求
    int client_sock =accept(serv_sock,(struct sockaddr *)&client_addr,&client_addr_size);
    char str[]="hello world";
    //向客户端发送数据
    //向客户端套接字中写入数据
    write(client_sock,str,sizeof(str));
    //关闭套接字
    close(client_sock);
    close(serv_sock);
    return 0;
}

client.cpp

//
// Created by fit on 16-5-19.
//

#include<stdio.h>
#include<cstring>
#include<stdlib.h>
#include<unistd.h>
#include <arpa/inet.h>
#include<sys/socket.h>
int main(){
    /*
     * This constant has the value 0.     * It‘s actually an automatic choice depending on socket type and family.
     * If you use it, and if the socket type is SOCK_STREAM and the family is AF_INET,
     * then the protocol will automatically be TCP (exactly the same as if you‘d used IPPROTO_TCP).
     * Buf if you use IPPROTO_IP together with AF_INET and SOCK_RAW, you will have an error,
     * because the kernel cannot choose a protocol automatically in this case.
     */
    int sock =socket(AF_INET,SOCK_STREAM,IPPROTO_IP);

    struct sockaddr_in serv_addr;
    memset(&serv_addr,0,sizeof(serv_addr));
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    serv_addr.sin_port= htons(2896);
    //通过connect函数向客户端发起请求,服务器的套接字信息存储在结构体serv_addr中
    connect(sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr));

    char buffer[40];
    //通过read从套接字中读取数据
    read(sock,buffer,sizeof(buffer)-1);

    printf("message from server: %s\n",buffer);
    //关闭套接字
    close(sock);
    return 0;

}

参考:

  1. stack_overflow
  2. man7
  3. c语言中文网

  

时间: 2024-08-09 10:29:27

linux 套接字编程入门--Hello World的相关文章

Linux 套接字编程 - select

select 可以感知文件表述符集合中的变化,如果办fd0(即标准输入)放入select的read fd set,发现只有按回车的时候select才会返回.查了下要把终端的缓冲大小设为1,这样就能实现击键后马上反应了. #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <termio.h> #include <sys/

Linux 套接字编程 - TCP连接基础

第五章的内容,实现一个echo服务器和对应的客户端,主要收获: 0. TCP socket编程主要基本步骤 1. SIGCHLD信号含义(子进程退出时向父进程发送,提醒父进程对其状态信息进行一个获取),waitpid 和 wait在使用上的差异,前者可以配置参数设定为非阻塞方式调用,更加灵活. 2. 信号处理函数与其过程(尤其是信号发生后不列队这个性质),相同的信号多次发生(间隔非常接近的话)可能仅会调用一次信号处理函数 3. 信号处理对慢系统(阻塞)调用如accept等的影响(如果信号处理设置

Linux 套接字编程中的 5 个隐患(转)

本文转自IBM博文Linux 套接字编程中的 5 个隐患. “在异构环境中开发可靠的网络应用程序”. Socket API 是网络应用程序开发中实际应用的标准 API.尽管该 API 简单,但是开发新手可能会经历一些常见的问题.本文识别一些最常见的隐患并向您显示如何避免它们. 在 4.2 BSD UNIX® 操作系统中首次引入,Sockets API 现在是任何操作系统的标准特性.事实上,很难找到一种不支持 Sockets API 的现代语言.该 API 相当简单,但新的开发人员仍然会遇到一些常

Linux 套接字编程中的 5 个隐患

在异构环境中开发可靠的网络应用程序 M. Tim Jones ([email protected]), 资深软件工程师, Emulex 简介: Socket API 是网络应用程序开发中实际应用的标准 API.尽管该 API 简单,但是开发新手可能会经历一些常见的问题.本文识别一些最常见的隐患并向您显示如何避免它们. 发布日期: 2005 年 10 月 08 日 级别: 中级 访问情况 : 13059 次浏览 评论: 0 (查看 | 添加评论 - 登录)  平均分 (34个评分)为本文评分 在

linux套接字编程之多进程多线程练习

一.概述:本次练习的是linux下的TAP/IP套接字多进程与多线程编程,功能只实现了对话.话不多说,直接上代码. 二.多进程: server.c: 1 /****************************************   2     > File Name:server.c   3     > Author:xiaoxiaohui   4     > mail:[email protected]   5     > Created Time:2016年05月15

Linux套接字编程

网络中的进程是如何通信的? 在网络中进程之间进行通信的时候,那么每个通信的进程必须知道它要和哪个计算机上的哪个进程通信.否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程).这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互. 什么是套接字? 套

linux套接字编程练习之网络选课模拟

  1 /****************************************                                                                                                    2     > File Name:server.c   3     > Author:xiaoxiaohui   4     > mail:[email protected]   5     >

Linux 套接字编程中要注意的细节

隐患 1.忽略返回状态 第一个隐患很明显,但它是开发新手最容易犯的一个错误.如果您忽略函数的返回状态,当它们失败或部分成功的时候,您也许会迷失.反过来,这可能传播错误,使定位问题的源头变得困难. 捕获并检查每一个返回状态,而不是忽略它们.考虑清单 1 显示的例子,一个套接字 send 函数. 清单 1. 忽略 API 函数返回状态 int status, sock, mode; /* Create a new stream (TCP) socket */ sock = socket( AF_IN

【转】Linux 套接字编程中的 5 个隐患

地址:请点击这里