概述
    网络编程实际上就是编写程序使两台联网的计算机相互的交换数据。操作系统会提供名为“ 套接字 ”的部件。套接字是网络数据传输的软件设备,即使对网络数据传输原理不太熟悉也无关紧要。我们也能通过套接字完成数据传输,因此网络编程又叫套接字编程。

过程 
    我们可以把套接字理解为我们平时的电话机,我们先看一下套接字的创建过程:
  1. 首先你如果要和别人沟通肯定要安装好电话机才可以,所以对应套接字的是调用socket函数时进行对话。
     #include<sys/socket.h>
int socket(int domain,int type,int protocol)
   成功时返回文件描述符,失败时返回-1.

2.  其次调用bind函数分配电话号码进行对话,所以用到bind函数,实际上分配的是ip地址。

 #include <sys/socket.h>
int bind(int sockfd,struct sockaddr *myaddr,socklen_t addrlen)
成功时返回0,失败返回-1
    3. 调用listen函数进行进行连线对话。
 int listen(int sockfd,int backlog)
成功时返回0,失败时返回-.
   4.调用accept函数进行对话
int accept(int skckfd,struct sockaddr *addr,socklen_t *addrlen)
成功时返回文件描述符,失败时返回-.
总结一下:
  • 调用socket函数创建套接字,为通话准备条件。
  • 调用bind函数分配ip地址和端口,从而确定地址。
  • 调用listen函数转为可接受请求状态。
  • 调用accept函数受理连接请求。

代码实现(基于LINUX)

   编写服务端代码,服务端是能够受理连接请求的程序,该服务端收到连接请求之后向请求者返回"Hello!"。先不用关注语言细节,先把整个套接字编程的整个过程熟悉一遍。

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h> void Error_Handling(char *message); int main(int argc,char *argv[])
{
int serverSocket;
int clientSocket;
struct sockaddr_in serverAddr;
struct sockaddr_in clientAddr;
socklen_t clientSocketAddrSize;
char message []="Hello!";
if(argc != )
{
printf("Usage:%s <port>\n",argv[]);
exit();
}
serverSocket = socket(PF_INET,SOCK_STREAM,);
if(serverSocket == -)
{
Error_Handling("socket() error");
}
memset(&serverAddr,,sizeof(serverAddr));
serverAddr.sin_family=AF_INET;
serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);
serverAddr.sin_port=htons(atoi(argv[]));
if(bind(serverSocket,(struct sockaddr*) &serverAddr,sizeof(serverAddr))==-)
{
Error_Handling("bind() error"); }
if(listen(serverSocket,)==-)
{
Error_Handling("listen() error");
}
clientSocketAddrSize = sizeof(clientAddr);
clientSocket = accept(serverSocket,(struct sockaddr*)&clientAddr,&clientSocketAddrSize);
if(clientSocket == -)
{
Error_Handling("accept() error"); }
write(clientSocket,message,sizeof(message));
close(clientSocket);
close(serverSocket);
return ;
} void Error_Handling(char *message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit();
}

套接字服务端程序

注解:

  • 第23行:调用socket函数创建套接字。
  • 第32行:调用bind函数分配IP地址和端口号
  • 第37行:调用listen函数套接字转为可接受链接状态。d
  • 第42行:调用accept函数受理请求连接。如果在没有连接请求的情况系调用该函数,则不会返回,知道有链接请求为止。
  • 第48行:write函数用于传输数据。

构建打电话套接字(编写客户端代码)

  服务器端创建的套接字又称为服务器套接字或监听程序套接字。客户端套接字的创建过程比服务器端套接字简单。

  请求连接的函数,因为其调用的是客户端套接字。

  

#include <sys/socket.h>
int connect(int sockfd,struct sockaddr *serv_addr,socklen_t addrlen);
成功时返回0,失败时返回-.

客户端套接字程序:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h> #define MAXSIZE 30
void Error_Handling(char* message); int main(int argc,char* argv[])
{
int sock;
struct sockaddr_in serverAddr;
char message[MAXSIZE];
int str_len;
if(argc != )
{
printf("Usage : %s <IP> <Port> \n",argv[]);
exit();
}
sock = socket(PF_INET,SOCK_STREAM,);
if(sock == -)
{
Error_Handling("sock() error");
}
memset(&serverAddr,,sizeof(serverAddr));
serverAddr.sin_family=AF_INET;
serverAddr.sin_addr.s_addr=inet_addr(argv[]);
serverAddr.sin_port=htons(atoi(argv[]));
if(connect(sock,(struct sockaddr*)&serverAddr,sizeof(serverAddr))==-)
{
Error_Handling("connect() error");
} str_len = read(sock,message,sizeof(message)-);
if(str_len == -)
{
Error_Handling("read error");
}
printf("Message from server : %s \n",message);
close(sock);
return ;
} void Error_Handling(char *message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit();
}

客户端套接字程序

linux 平台运行(我的环境时Debian 7)

此时服务端在等待请求,然后先打开一个窗口并运行客户端代码,然后如下图所示

  1.在有些函数里面成功时返回文件描述符,其中文件描述符也叫文件句柄

文件描述符 对象
0 标准输入:Standard Input
1 标准输出:Standard Output 
2 标准错误:Standard Error

要想了解具体代码含义,轻耐心等待下一篇博客(套接字类型和协议设置)!

参考书籍:

    《Unix 网络编程》

    《TCP/IP 网络编程》

TCP/IP网络编程系列之一(初级)的更多相关文章

  1. TCP/IP网络编程系列之四(初级)

    TCP/IP网络编程系列之四-基于TCP的服务端/客户端 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP和UDP套接字.因为TCP套接字是面向连接的,因此又称为基于流的 ...

  2. TCP/IP网络编程系列之三(初级)

    TCP/IP网络编程系列之三-地址族与数据序列 分配给套接字的IP地址和端口 IP是Internet Protocol (网络协议)的简写,是为首发网络数据而分配给计算机的值.端口号并非赋予计算机值, ...

  3. TCP/IP网络编程系列之二(初级)

    套接字类型与协议设置 我们先了解一下创建套接字的那个函数 int socket(int domain,int type,int protocol);成功时返回文件描述符,失败时返回-1.其中,doma ...

  4. TCP/IP网络编程之多进程服务端(二)

    信号处理 本章接上一章TCP/IP网络编程之多进程服务端(一),在上一章中,我们介绍了进程的创建和销毁,以及如何销毁僵尸进程.前面我们讲过,waitpid是非阻塞等待子进程销毁的函数,但有一个不好的缺 ...

  5. 浅谈TCP/IP网络编程中socket的行为

    我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) 2. Socket I/O系统 ...

  6. 《TCP/IP网络编程》

    <TCP/IP网络编程> 基本信息 作者: (韩)尹圣雨 译者: 金国哲 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115358851 上架时间:2014-6- ...

  7. TCP/IP网络编程之多线程服务端的实现(二)

    线程存在的问题和临界区 上一章TCP/IP网络编程之多线程服务端的实现(一)的thread4.c中,我们发现多线程对同一变量进行加减,最后的结果居然不是我们预料之内的.其实,如果多执行几次程序,会发现 ...

  8. TCP/IP网络编程之优于select的epoll(二)

    基于epoll的回声服务端 在TCP/IP网络编程之优于select的epoll(一)这一章中,我们介绍了epoll的相关函数,接下来给出基于epoll的回声服务端示例. echo_epollserv ...

  9. TCP/IP网络编程之进程间通信

    进程间通信基本概念 进程间通信意味着两个不同进程间可以交换数据,为了完成这一点,操作系统中应提供两个进程可以同时访问的内存空间.但我们知道,进程具有完全独立的内存结构,就连通过fork函数创建的子进程 ...

随机推荐

  1. 关联规则(Apriori算法)

    关联分析直观理解 关联分析中最有名的例子是“尿布与啤酒”.据报道,美国中西部的一家连锁店发现,男人们会在周四购买尿布和啤酒.这样商店实际上可以将尿布与啤酒放在一块,并确保在周四全价销售从而获利.当然, ...

  2. cisco 访问控制列表

    LAB-A:Lab-A(config)#host Lab-A Lab-A(config)#interface Ethernet0/0  LAB-A(config-if)#ip address 172. ...

  3. idea、eclipse常用快捷键

    idea常用快捷键 Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最近的文件Ctrl+Shift+E,最近更改的文件Shift+Click,可以 ...

  4. 【VS开发】进程线程及堆栈关系的总结

    进程线程及堆栈关系的总结 突然想到进程的栈和线程的栈,就顺便说一下,线程的栈被自动分配到进程的内存空间中 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性. ...

  5. C学习笔记-文件操作

    文件操作大致分三步 打开文件 读写文件 关闭文件 二进制和文本模式的区别 在windows系统中,文本模式下,文件以"\r\n"代表换行.若以文本模式打开文件,并用fputs等函数 ...

  6. LINQ查询表达式详解(2)——查询表达式的转换

    简介 C#在执行LINQ查询表达式的时候,并不会指定其执行语义,而是将查询表达式转换为遵循查询表达式模式的方法的调用.具体而言,查询表达式将转换为以下名称的调用:Where.Select.Select ...

  7. 浅谈Web图像优化

    前端优化有很多,图像优化也是其中的一部分.无论是渐进增强还是优雅降级,图像优化成为了开发上不可忽视的一部分. 知其然,须知其所以然 图像优化的前提是需要了解图像的基本原理.常规的图像格式分为矢量图和位 ...

  8. 从零开始,SpreadJS 新人学习笔记(第二周)

    Hello,大家好,我是Fiona.经过上周的学习,我已经初步了解了SpreadJS的目录结构,以及如何创建Spread项目到我的工程目录中.>>还不知如何开始学习SpreadJS的同学, ...

  9. sql server 查询某段日期某段时间内的数据

    如我要取8月1号到8月30号之间的早上7点半到晚上八点半这段时间内的数据. SELECT * FROM tableName AS tWHERE t.create_date BETWEEN '2017- ...

  10. Xtrabackup innobackupex

    Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工. Xtrabackup中主要包含两个工具 ...