下面是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. 字符集 ISO-8859-1(2)

    HTML 支持的数学符号 结果 描述 实体名称 实体编号 ∀ for all ∀ ∀ ∂ part ∂ ∂ ∃ exists &exists; ∃ ∅ empty ∅ ∅ ∇ nabla ∇ ...

  2. Mysql中常用的函数汇总

    Mysql中常用的函数汇总: 一.数学函数abs(x) 返回x的绝对值bin(x) 返回x的二进制(oct返回八进制,hex返回十六进制)ceiling(x) 返回大于x的最小整数值exp(x) 返回 ...

  3. JS 工具 构建工具

    1.gruntjs http://www.gruntjs.net/ 2.bootstrap http://www.bootcss.com/ 3.

  4. js原生设计模式——6复杂对象的构建—Builder建造者模式

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  5. js原生设计模式——2面向对象编程之继承—多继承

    1.单对象克隆 <!DOCTYPE html><html lang="en"><head>    <meta charset=" ...

  6. Update关联查询不走索引,效率低下

    优化一个sql,就是有A,B两个表,要利用b表的字段更新a表对应的字段.形如 Sql代码 update A set A.a=(select B.b from B where A.id=B.id); 原 ...

  7. MyBatis中的条件判断单引号双引号的使用

    对于字符串判断, <if test="aIn != 'A'" >会出现问题,系统会试图把'A'转成数字,改为 <if test='aIn != "A&q ...

  8. IIS7和Tomcat7整合,即IIS7和Tomcat共用80端口

    IIS7和Tomcat7整合,即IIS7和Tomcat共用80端口 背景: 最近公司有一个项目要上线,需要用到iis和tomcat整合,共用80端口.由于公司的数据都非常重要,只通过端口映射到外网的8 ...

  9. validform表单验证插件最终版

    做个笔记,以后直接用吧. 报名界面: <%@ page language="java" pageEncoding="UTF-8" contentType= ...

  10. 负载均衡软件LVS分析四(测试)

    一.启动LVS集群服务LVS负载均衡管理和使用有两种方式,一种是以ipvsadm命令行脚步与ldirectord监控方式,一种是以Piranha工具进行管理和使用.下面分别介绍. 1.利用ipvsad ...