下面是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编程的更多相关文章

  1. 网络编程学习笔记一:Socket编程

    “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...

  2. 转 网络编程学习笔记一:Socket编程

    题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...

  3. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  4. C#版 Socket编程(最简单的Socket通信功能)

    示例程序是同步套接字程序,功能很简单,只是客户端发给服务器一条信息,服务器向客户端返回一条信息:这里只是一个简单的示例,是一个最基本的socket编程流程,在接下来的文章中,会依次记录套接字的同步和异 ...

  5. 【转/TCP协议编程】 基于TCP的Socket 编程

    基于TCP(面向连接)的socket编程,分为客户端和服务器端. 客户端的流程如下: (1)创建套接字(socket) (2)向服务器发出连接请求(connect) (3)和服务器端进行通信(send ...

  6. Linux C编程一站式学习读书笔记——socket编程

    前言 研一的时候写过socket网络编程,研二这一年已经在用php写api都快把之前的基础知识忘干净了,这里回顾一下,主要也是项目里用到了,最近博客好杂乱啊,不过确实是到了关键时刻,各种复习加巩固准备 ...

  7. Linux下面向TCP连接的C++ Socket编程实例

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.即Socket提供了操作上述特殊文件的接口,使用这些接口可以实现网络编程. Socket通信流程图 TCP(Transmis ...

  8. 简单的socket编程

    1.socket 服务器搭建 实例化socket服务器,循环获取请求 package com.orange.util; import java.io.IOException; import java. ...

  9. python 简单的Socket编程

    python 编写server的步骤: 1第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket(family, type ) family参数代表 ...

随机推荐

  1. CSS3 :target伪类的理解与使用

    CSS3 :target伪类用来改变页面中锚链接URL所指向的ID元素的样式,例如你要改变描链接指向#tab的元素字体颜色为蓝色,哪么你可以这样写成#tab:target {color:blue} 浏 ...

  2. CSS中设置margin:0 auto; 水平居中无效的原因分析

    很多初学制作网页的朋友,可能会遇到的一个常见问题,就是在CSS中加了margin:0 auto;却没有效果,不能居中的问题,margin:0 auto;的意思就是:上下边界为0,左右根据宽度自适应,其 ...

  3. iOS 之 alcatraz (插件管理器)

    1. 安装 1.1. 打开命令行 curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/ins ...

  4. HTTP协议缓存策略深入详解之ETAG妙用

    Etag是什么: Etag 是URL的Entity Tag,用于标示URL对象是否改变,区分不同语言和Session等等.具体内部含义是使服务器控制的,就像Cookie那样. HTTP协议规格说明定义 ...

  5. 搜索框(SearchView)的功能与用法

    SearchView是搜索框组件,它可以让用户在文本框内输入汉字,并允许通过监听器监控用户输入,当用户用户输入完成后提交搜索按钮时,也通过监听器执行实际的搜索. 使用SearchView时可以使用如下 ...

  6. Maven与Antx(整理)

    http://blog.csdn.net/ghost_t/article/details/5709640 一.Maven与Antx概况: Antx简介   在讲为什么使用maven之前我想说一下,an ...

  7. HTML 颜色值

    HTML 颜色值 颜色由红(R).绿(G).蓝(B)组成. 颜色值 颜色值由十六进制来表示红.绿.蓝(RGB). 每个颜色的最低值为0(十六进制为00),最高值为255(十六进制为FF). 十六进制值 ...

  8. MyBatis动态SQL与模糊查询

    sqlxml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC & ...

  9. ES2:ElasticSearch 集群配置

    ElasticSearch共有两个配置文件,都位于config目录下,分别是elasticsearch.yml和logging.yml,其中,elasticsearch.yml 用来配置Elastic ...

  10. 《JAVASCRIPT高级程序设计》节点层次和DOM操作技术

    DOM可以将任何HTML和XML文档描绘成一个由多层次节点构成的结构.节点分为几种不同的类型,每种类型分别表示文档中不同的信息,每种类型都继承与Node接口,因此都共同享有一些属性和方法,同时,也拥有 ...