linux网络编程初步
来源:互联网 发布:女生上半身过瘦 知乎 编辑:程序博客网 时间:2024/06/13 07:09
对于linux的服务器编程而言,几个基本的api是必备的,算起来攻读linux也有一段时间了,但是却没有将反思记录下来形成文字。
网络编程底层的API相对固定也比较容易 理解,最近写的是一个利用SOCK_STREAM也就是TCP链接的SOCKE通信测试, 只是个框架,没有实质内容,但就是因为简单才能一眼看出主要的API函数。
server.c
<pre name="code" class="cpp">#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXLINE 80#define SERV_PORT 1234int main(){const char *ip = "127.0.0.1";struct sockaddr_in seraddr, cliaddr;socklen_t cliaddr_len;int listenfd, connfd;char buff[MAXLINE];char str[INET_ADDRSTRLEN];int i, n;listenfd = socket(AF_INET, SOCK_STREAM, 0);bzero(&seraddr, sizeof(seraddr));seraddr.sin_family = AF_INET;//seraddr.sin_addr.s_addr = htonl(INADDR_ANY);inet_pton(AF_INET, ip, &seraddr.sin_addr);seraddr.sin_port = htons(SERV_PORT);bind(listenfd, (struct sockaddr *)&seraddr, sizeof(seraddr));listen(listenfd, 20);printf("begin acceptting...\n");while(1){cliaddr_len = sizeof(cliaddr);connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);recv(connfd, buff, sizeof(buff), 0);printf("%s\n", buff);close(connfd);}close(listenfd);return 0;}
client.c
<pre name="code" class="cpp">#include <sys/socket.h>#include <sys/types.h>#include <unistd.h>#include <netinet/in.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#define MAXLINE 80#define PORT 1234int main(int argc, char **argv){ const char *ip = "127.0.0.1"; struct sockaddr_in seraddr; char buf[MAXLINE]; int sockfd, n; sockfd = socket(AF_INET, SOCK_STREAM, 0); seraddr.sin_family = AF_INET; inet_pton(AF_INET, ip, &seraddr.sin_addr); seraddr.sin_port = htons(PORT); connect(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr)); char *str = argv[1]; strcpy(buf, str); send(sockfd, buf, sizeof(buf), 0); close(sockfd); return 0;}~ ~
以上 是两个最简单的通信的例子,谈不上逻辑,不过至少能看出API之间的调用关系。
网络之间的通信涉及到不同主机间的交互,而字节在不同操作系统中的存储有大端和小端之分。32位的CPU一次处理4个字节,64位的CPU一次处理6B, 但这4B/8B在地址空间的存储却有大端和小端之分。利用下面的程序可以区分出大小端
#include <stdio.h>void byteorder(){union{short value;char union_bytes[sizeof(short)];}test;test.value = 0x0102;if( (test.union_bytes[0] == 1) && (test.union_bytes[2] == 2) ){printf("big\n");}else if( (test.union_bytes[0] == 2) && (test.union_bytes[1] == 1) ){printf("little\n");}else{printf("unknown\n");}}int main(){byteorder();return 0;}
0 0
- linux网络编程初步
- Linux网络编程初步认识
- Linux 网络程序编程初步 Socket
- Linux-(C)网络编程学习socket(初步)
- Java网络编程初步
- Java网络编程初步
- Java网络编程初步
- UNIX网络编程初步
- Android 网络编程初步
- UNIX网络编程初步
- UNIX网络编程初步
- 网络编程初步
- Java 网络编程初步
- 网络编程初步
- Python 网络编程初步
- 网络编程初步
- 网络编程初步
- JAVA网络编程初步
- 男人须知
- Cocoa的MVC架构分析
- 安卓之广播接收者 手机重启监听
- Windows移动开发(三)——闭关修炼
- 一维数组的最大子段和
- linux网络编程初步
- leetcode之 Longest Substring Without Repeating Characters
- js操作iframe父子窗体
- 状态栏的编程(时间状态栏,进度状态栏)
- 让别人欣赏你的28个理由
- 一天问题小结20140521
- STM32之中断与事件---中断与事件的区别
- rstplib源码分析---快速生成树之端口角色转移状态机
- Android环境搭建的最新方法,方便、简单、极度容易。