linux网络编程1 最简单的socket编程
下面是socket编程的服务器端
先看一个图,
1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h> //针对系统调用的封装 fork,pipe 各种i/o原语 read write 等 #include<sys/socket.h>
#include<netinet/in.h> //互联网地址族 定义数据结构sockaddr_in
#include<arpa/inet.h> //提供IP地址转换函数 #include<ctype.h> //一批C语言字符分类函数 用 于 测试字符是否属于特定的字符类别 topper()在这里 #define MAXLINE 80
#define SER_PORT 8000 int main(void){ struct sockaddr_in servaddr,cliaddr;
socklen_t cliaddr_len; int listenfd,connfd;
char buf[MAXLINE];
char str[INET_ADDRSTRLEN];
int i,n;
char tt[] = "exit1"; //这里有字符数组和字符指针的区别的坑 具体百度查询
char *bb; listenfd = socket(AF_INET,SOCK_STREAM,); //
// domain 协议域 AF_INET AF_INET6,AF_LOCAL(AF_UNIX) AF_ROUTE
// type socket类型 SOCK_STREAM(流式socket 针对tcp ) SOCK_DGRAM(数据包 针对udp) SOCK_RAW
// protocol 协议 tcp协议,udp协议 stcp协议 tipc协议 bzero(&servaddr,sizeof(servaddr)); //初始化赋值为0 servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //任何ip //这里是大小端的 转换问题。。可以 百度
servaddr.sin_port = htons(SER_PORT); //端口 bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); //绑定链接的套接字描述符 和 地址和端口 listen(listenfd,); printf("Accepting connections ... \n ");
while(){ cliaddr_len = sizeof(cliaddr);
connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&cliaddr_len); //连接的套接字描述符 返回链接的地址 返回地址的缓冲区长度 //返回 客户端的套接字描述符
printf("connfd:%d------\n",connfd); printf("received from %s at PORT %d \n",
inet_ntop(AF_INET,&cliaddr.sin_addr,str,sizeof(str)),
ntohs(cliaddr.sin_port));
while(){
n = read(connfd,buf,MAXLINE); // read(int fd,void *buf, size_t count); 成功返回 读取的字节数 数据保存在buf上 读取客户端的数据 printf("%d,")
//printf("buf:%s-----%d\n",buf,strcmp(buf,"exit1"));
//printf("tt:%s-----%d\n",tt,strcmp(tt,"exit1"));
for(int i=;i<;i++){
tt[i] = buf[i];
}
printf("tt:%s-----%d\n",tt,strcmp(tt,"exit1"));
if(strcmp(tt,"exit1") == ){ //strcmp 对比的就是字符
close(connfd);
printf("close:-----\n");
break;
} for(i=; i < n; i++){
buf[i] = toupper(buf[i]);
}
write(connfd,buf,n); // // 向客户端写入数据
} } return ; } //这个程序有漏洞,如果客户端断线或者关闭,服务器就会死循环。 客户端的标准输入是阻塞的。。。其他都不是阻塞的。
客户端
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h> #include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h> #include<errno.h> //错误 #define MAXLINE 80
#define SER_PORT 8000 int main(int argc,char *argv[]){ struct sockaddr_in servaddr;
char buf[MAXLINE]; int sockfd,n;
char *str;
char tt[]; //if(argc != 2){
// fputs("usage: ./client message \n ",stderr);
// exit(1);
//} //str = argv[1]; sockfd = socket(AF_INET,SOCK_STREAM,); bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
inet_pton(AF_INET,"127.0.0.1",&servaddr.sin_addr);
servaddr.sin_port = htons(SER_PORT); if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<){
printf("connet error:%s\n",strerror(errno));
} //链接服务器 while(){ memset(buf,,MAXLINE);
printf("client connet server ...\n");
n = read(STDIN_FILENO,buf,MAXLINE); //从标准输入 读取数据
for(int i=;i<;i++){
tt[i] = buf[i];
}
if(strcmp(tt,"exit1") == ){
printf("exit server connect \n");
close(sockfd);
return ;
} write(sockfd,buf,n); //把我们的输入,写到服务器 if(strcmp(tt,"exit1") == ){
printf("exit server connect \n");
close(sockfd);
return ;
} n = read(sockfd,buf,MAXLINE); //从服务器读取数据 printf("Response from server:\n");
write(STDOUT_FILENO,buf,n); //写到标注输出上
printf("\n");
} close(sockfd);
return ; }
实验结果:

总结:一个socket建立一个连接,必须配合一个connect,对应的服务器端对应一个accept 。不能多次connet,多次是之后会报错,也不能同一个客户端socket多次accept,因为服务器已经有了,accept会阻塞等待其他客户端的socket。
linux网络编程1 最简单的socket编程的更多相关文章
- 网络编程学习笔记一:Socket编程
“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...
- 转 网络编程学习笔记一:Socket编程
题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...
- 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程
Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...
- C#版 Socket编程(最简单的Socket通信功能)
示例程序是同步套接字程序,功能很简单,只是客户端发给服务器一条信息,服务器向客户端返回一条信息:这里只是一个简单的示例,是一个最基本的socket编程流程,在接下来的文章中,会依次记录套接字的同步和异 ...
- 【转/TCP协议编程】 基于TCP的Socket 编程
基于TCP(面向连接)的socket编程,分为客户端和服务器端. 客户端的流程如下: (1)创建套接字(socket) (2)向服务器发出连接请求(connect) (3)和服务器端进行通信(send ...
- Linux C编程一站式学习读书笔记——socket编程
前言 研一的时候写过socket网络编程,研二这一年已经在用php写api都快把之前的基础知识忘干净了,这里回顾一下,主要也是项目里用到了,最近博客好杂乱啊,不过确实是到了关键时刻,各种复习加巩固准备 ...
- Linux下面向TCP连接的C++ Socket编程实例
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.即Socket提供了操作上述特殊文件的接口,使用这些接口可以实现网络编程. Socket通信流程图 TCP(Transmis ...
- 简单的socket编程
1.socket 服务器搭建 实例化socket服务器,循环获取请求 package com.orange.util; import java.io.IOException; import java. ...
- python 简单的Socket编程
python 编写server的步骤: 1第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket(family, type ) family参数代表 ...
随机推荐
- Zepto 使用中的一些注意点(转)
http://www.zeptojs.cn/ zepto英文站在线文档 http://www.css88.com/doc/zeptojs_api/ zepto中文站在线文档 htt ...
- SecureCRT 使用
1. 连接linux 服务器 http://www.cnblogs.com/SimonGao/p/4959274.html
- Lazy.js : 让 JavaScript 变懒
Lazy.js : 让 JavaScript 变懒 http://segmentfault.com/a/1190000000358463
- 在Flex中用于处理XML对象的E4X 方法
ECMAScript for XML 规范定义了一组用于使用 XML 数据的类和功能.这些类和功能统称为 E4X.ActionScript 3.0 包含以下 E4X 类:XML.XMLList.QNa ...
- Mongoose与bluebird结合使用实例
nodejs的所有调用几乎是全异步的,而所有的IO操作也都是通过回调函数才能知道结果. 如果一个异步调用依赖另一个异步调用,如果没有Promise的话,有可能陷入传说中的回调地狱. bluebird实 ...
- php知识点总结(一)
1.把数组以表格的形式显示 <?php $array = array( '书籍' => array( '生活', '人与自然','动物世界'), '体育用品' => array ...
- Spark计算模型
[TOC] Spark计算模型 Spark程序模型 一个经典的示例模型 SparkContext中的textFile函数从HDFS读取日志文件,输出变量file var file = sc.textF ...
- MyBatis中多对多关系的映射和查询
先说一下需求: 在页面上显示数据库中的所有图书,显示图书的同时,显示出该图书所属的类别(这里一本书可能同时属于多个类别) 创建表: 笔者这里使用 中间表 连接 图书表 和 图书类别表,图书表中 没有使 ...
- IOS学习之block代码块
前言: block这个名词对于做一般开发者来说可能会觉得稀奇古怪而非常陌生,但是对于iOS工程师来说,在整个开发中到处都是它的影子,今天一大早觉得在假期学习一下它,对明年的iOS开发工作做个准备,突然 ...
- 使用JAVA开发微信公众平台(一)——环境搭建与开发接入
一. 初始微信公众平台 微信公众平台,即我们平时所说的"公众号",曾用名"官方平台"."媒体平台",但最终命名为"公众平台&quo ...