下述代码是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,,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();
//将套接字和结构体进行绑定 结构体中存储了套接字的协议 端口号 以及ip地址
bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
//进入监听状态,等待用户发起请求
//进入被动监听状态,套接字一直处于睡眠状态,直至客户端发起请求才会被重新唤醒
listen(serv_sock,);
//客户端请求对应的套接字结构体
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 ;
}

client.cpp

#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,,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();
//通过connect函数向客户端发起请求,服务器的套接字信息存储在结构体serv_addr中
connect(sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)); char buffer[];
//通过read从套接字中读取数据
read(sock,buffer,sizeof(buffer)-); printf("message from server: %s\n",buffer);
//关闭套接字
close(sock);
return ; }

参考:

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

  

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

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

    本文转自IBM博文Linux 套接字编程中的 5 个隐患. “在异构环境中开发可靠的网络应用程序”. Socket API 是网络应用程序开发中实际应用的标准 API.尽管该 API 简单,但是开发新 ...

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

    在 4.2 BSD UNIX® 操作系统中首次引入,Sockets API 现在是任何操作系统的标准特性.事实上,很难找到一种不支持 Sockets API 的现代语言.该 API 相当简单,但新的开 ...

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

    http://www.ibm.com/developerworks/cn/linux/l-sockpit/ 在 4.2 BSD UNIX® 操作系统中首次引入,Sockets API 现在是任何操作系 ...

  4. Linux套接字编程

    网络中的进程是如何通信的? 在网络中进程之间进行通信的时候,那么每个通信的进程必须知道它要和哪个计算机上的哪个进程通信.否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行 ...

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

    隐患 1.忽略返回状态 第一个隐患很明显,但它是开发新手最容易犯的一个错误.如果您忽略函数的返回状态,当它们失败或部分成功的时候,您也许会迷失.反过来,这可能传播错误,使定位问题的源头变得困难. 捕获 ...

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

    第五章的内容,实现一个echo服务器和对应的客户端,主要收获: 0. TCP socket编程主要基本步骤 1. SIGCHLD信号含义(子进程退出时向父进程发送,提醒父进程对其状态信息进行一个获取) ...

  7. Linux 套接字编程 - select

    select 可以感知文件表述符集合中的变化,如果办fd0(即标准输入)放入select的read fd set,发现只有按回车的时候select才会返回.查了下要把终端的缓冲大小设为1,这样就能实现 ...

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

    地址:请点击这里

  9. socket套接字编程(1)——基本函数

    TCP交互流程: 服务器:1. 创建socket:2. 绑定socket和端口号:3. 监听端口号:4. 接收来自客户端的连接请求:5. 从socket中读取字符:6. 关闭socket. 客户端:1 ...

随机推荐

  1. wince天气代码

    #ifndef COMMON_H #define COMMON_H #include <Windows.h> typedef struct _operateInfo { HANDLE hS ...

  2. FragmentActivity

    子fragment 调用 FragmentActivity ((FragmentActivity) getActivity()).updateUnreadLabel(); FragmentActivi ...

  3. Android------自定义ListView详解

    引自:http://www.cnblogs.com/phonegap/archive/2011/04/28/2535732.html 在这里我就对自定义ListView进行讲解下吧,直入真题吧,首先我 ...

  4. android屏幕适配方法

    android中图片适配是一件很棘手的事情,本篇文章详细的介绍屏幕显示的原理,为什么会资源文件中会存在 drawable-ldpi.drawable-mdpi.drawable-hdpi.drawab ...

  5. 【2013 ICCV】Abnormal Event Detection at 150 FPS in MATLAB

    2. method 把每一帧变成不同尺度,并且把每一层分成互不覆盖的patch.连续的5帧堆叠在一起形成时空立方体.对时空立方体计算3D梯度特征[11].这些视屏序列中的特征,根据空间位置的相关性,进 ...

  6. 集合-字典(Lookup/SortedDictionary)

    Lookup<TKey, TElement>非常类似于Dictionary<TKey, TValue>,但是把键映射在一个值集上. 必须调用ToLookup方法创建Lookup ...

  7. java项目开发第六天——天若有情天亦老,人间正道是沧桑

    今天讲解的东西是数据库连接,一天下来还是相对轻松的,这个组长也是够轻松的,队员加载的界面自己也是导入不了,最后也是不了了之,还是加油赶赶吧.看看严嘉那组的界面,最后就是呵呵.但是学长看完后(研究生,同 ...

  8. Java虚拟机中的内存分配

    java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途以及创建和销毁的时间. 栈:存放的是局部变量,包括:1.用来保存基本数据类型的值:2.保存类 ...

  9. TCP重传问题解决思路

    处理线上问题经常会碰到网络抖动的情况, 网络抖动有可能就是TCP重传导致,下面简单说下TCP重传的排查思路,不一定能完全解决问题 1. 找运维同事确定是否是网线问题, 如果是网线问题请更换网线 2. ...

  10. CDOJ 1272 Final Pan's prime numbers

    有些问题,不做实践与猜测,可能一辈子也想不出答案,例如这题. #include<stdio.h> #include<math.h> long long x; int main( ...