Linux C编程一站式学习读书笔记——socket编程
前言
概述
- 在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通迅中的一个进程,“IP地址+端口号”就称为socket
- 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就是唯一标识一个连接。socket本身有“插座”的意思,用来描述网络连接中一对一关系
- TCP/IP协议最早是BSD UNIX上实现,为TCP/IP协议设计的应用层编程接口称为socket API
预备知识
先发出去的数据是低地址,后发出去的数据是高地址
#include <arpa/inet.h> /*h表示host,n表示network, htonl表示将32位长整数从主机字节序转换为网络字节序*/
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
socket地址的数据类型以及相关函数
基于TCP协议的网络程序
简单的TCP网络程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> #define MAXLINE 80
#define SERV_PORT 9933 int main(void)
{
struct sockaddr_in servaddr, cliaddr; // 服务器和客户端的socket数据结构
// typedef int socklen_t;
// typedef int ssize_t;
socklen_t cliaddr_len;
int listenfd, connfd;
char buf[MAXLINE];
char str[INET_ADDRSTRLEN]; // 创建socket,返回整形socket标识
// domain = AF_INT : 套接字指定IPV4网络协议集
// type = SOCK_STREAM : 可靠的面向流服务器或套接字
// protocol = 0, 选择缺省的传输协议
listenfd = socket(AF_INET, SOCK_STREAM, 0); // 为服务器的sockaddr_in数据结构分配内存地址
memset(&servaddr, 0, sizeof(servaddr));
// 为服务器套接字指定协议族
servaddr.sin_family = AF_INET;
// 为服务器套接字指定ip,INADDR_ANY = 0.0.0.0
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
// 为服务器套接字指定port
servaddr.sin_port = htons(SERV_PORT); // 为一个套接字分配地址,使用socket()创建套接字后,
// 只赋予其使用的协议,并未分配地址,bind()用来为listenfd
// 分配地址,参数解释:
// sockfd = listenfd, bind函数的套接字描述符
// my_addr = &servaddr, 服务器端sockaddr结构的指针
// addrlen = sizeof(servaddr), sockaddr结构的长度
bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); // socket监听,准备接受连接请求
listen(listenfd, 20); printf("王正一的server服务器开始等待客户端连接 ...\n"); while (1) {
cliaddr_len = sizeof(cliaddr);
// 三次握手完成后,服务器调用accept()接受客户端连接
// accept()参数:
// sockfd = listenfd, 服务器端监听的套接字描述符
// cliaddr = &cliaddr, 指向sockaddr结构体指针,客户端
// 的地址信息
// addrlen = &cliaddr_len,确定客户端地址结构体的大小
connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);
read(connfd, buf, MAXLINE);
printf("从客户端%s的%d端口收到数据\n",
inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)), ntohs(cliaddr.sin_port)); strcat(buf, "从王正一机器返回的信息"); write(connfd, buf, MAXLINE);
close(connfd);
}
}
运行状态:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> #define MAXLINE 80
#define SERV_PORT 9933 int main(int argc, char *argv[])
{
// 需要连接的服务器端socket套接字
// 客户端的socket套接字由系统自动分配
struct sockaddr_in servaddr;
char buf[MAXLINE];
int servfd;
char *str; if (argc != 2) {
printf("使用方法:./client 发送的字符串\n");
return 1;
} str = argv[1]; servfd = socket(AF_INET, SOCK_STREAM, 0); memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr("222.31.79.131"); // 传媒ip
servaddr.sin_port = htons(SERV_PORT); // 客户端调用connect连接服务器端指定socket套接字
connect(servfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); write(servfd, str, strlen(str)); read(servfd, buf, MAXLINE);
printf("从服务器返回的信息为:%s", buf); close(servfd); return 0;
}
运行状态:
使用fork并发处理多个client的请求
Linux C编程一站式学习读书笔记——socket编程的更多相关文章
- gdb笔记 ---《Linux.C编程一站式学习》
gdb笔记 ---<Linux.C编程一站式学习> 单步执行和跟踪函数调用 函数调试实例 #include <stdio.h> int add_range(int low, i ...
- 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)
<Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...
- 《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)
<Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h> ...
- 《Linux/Unix系统编程手册》读书笔记1
<Linux/Unix系统编程手册>读书笔记 目录 最近这一个月在看<Linux/Unix系统编程手册>,在学习关于Linux的系统编程.之前学习Linux的时候就打算写关于L ...
- Linux网络编程一站式学习
提要 学过非常多遍计算机网络,依旧不会网络编程. 看完这篇文章之后就不会是这样了. 环境:Ubuntu14.04 64bit 何为Socket 是基于TCP/IP的网络应用编程中使用的有关数据通信的概 ...
- [Linux] Linux C编程一站式学习 Part.3
Linux系统编程 文件与I/O C标准I/O库函数与Unbuffered I/O函数 C标准I/O库函数printf().putchar().fputs(),会在用户空间开辟I/O缓冲区 系统函数o ...
- 《Linux/Unix系统编程手册》读书笔记 目录
<Linux/Unix系统编程手册>读书笔记1 (创建于4月3日,最后更新4月7日) <Linux/Unix系统编程手册>读书笔记2 (创建于4月9日,最后更新4月10日) ...
- 《Linux/Unix系统编程手册》读书笔记9(文件属性)
<Linux/Unix系统编程手册>读书笔记 目录 在Linux里,万物皆文件.所以文件系统在Linux系统占有重要的地位.本文主要介绍的是文件的属性,只是稍微提及一下文件系统,日后如果有 ...
- 《Linux/Unix系统编程手册》读书笔记6
<Linux/Unix系统编程手册>读书笔记 目录 第9章 这章主要讲了一堆关于进程的ID.实际用户(组)ID.有效用户(组)ID.保存设置用户(组)ID.文件系统用户(组)ID.和辅助组 ...
随机推荐
- 安卓CTS官方文档之兼容性方案概览
兼容性方案概览 安卓的兼容性方案让安卓手机生产商能够很容易就开发中可兼容的安卓设备(天地会珠海分舵注:可兼容什么呢?就是可以兼容标准google提供的安卓系统可以支持的功能,以防手机生产商把开源的安卓 ...
- SQL Server 2008 R2中,变表的右键弹出菜单中的“选择前1000行”为“选择所有行”
原文:SQL Server 2008 R2中,变表的右键弹出菜单中的"选择前1000行"为"选择所有行" 从SQL Server 2008开始,微软为了提高查询 ...
- td中的值自动换行
设置td中的值自动换行在<td ></td> 中加上这样一句代码,可以简省设置,使长字符串换行.而不用设置width,height. style="word-wrap ...
- SQL点滴22—性能优化没有那么神秘
原文:SQL点滴22-性能优化没有那么神秘 经常听说SQL Server最难的部分是性能优化,不禁让人感到优化这个工作很神秘,这种事情只有高手才能做.很早的时候我在网上看到一位高手写的博客,介绍了SQ ...
- 【MS SQL】查看任务执行进度
原文:[MS SQL]查看任务执行进度 备份或还原数据库时,我一般是用MS SQL工具向导来进行,由于工具向导没有显示任务执行过程的状态, 如果数据库比较大执行时间较长的话,对任务啥时候执行完成比较迷 ...
- Failed to issue method call: Unit mysql.service failed to load: No such file or directory解决的方式
Failed to issue method call: Unit mysql.service failed to load: No such file or directory解决的方式 作者:ch ...
- 将Model实体类对象作为WebService接口参数(转)
转自:http://www.cnblogs.com/fengyishou/archive/2009/02/27/1399281.html 关于web服务的有关基础知识,看了基本书,但是不敢在这里乱说, ...
- Visual Studio 2013 Update 3
微软正式发布Visual Studio 2013 Update 3 (2013.3) RTM 昨 天微软的Visual Studio 2013 Update 3(Visual Studio 201 ...
- 比Spring简单的IoC容器
比Spring简单的IoC容器 Spring 虽然比起EJB轻量了许多,但是因为它需要兼容许多不同的类库,导致现在Spring还是相当的庞大的,动不动就上40MB的jar包, 而且想要理解Spring ...
- Android 5.0自定义动画
材料设计中的动画对用户的操作给予了反馈,并且在与应用交互时提供了持续的可见性.材料主题提供了一些按钮动画和活动过渡,Android 5.0允许你自定义动画并且可以创建新的动画: Touch Feedb ...