热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C语言——socket通信详解

目录关键函数服务端客户端效果展示客户端服务端关键函数1、intsocket(intfamily,inttype,intprotocol)family:指定使用的协议簇:AF_INE

目录

    • 关键函数
    • 服务端
    • 客户端
    • 效果展示
      • 客户端
      • 服务端


关键函数


1、int socket(int family,int type,int protocol)

family:指定使用的协议簇:AF_INET(IPv4) AF_INET6(IPv6) AF_LOCAL(UNIX协议) AF_ROUTE(路由套接字) AF_KEY(秘钥套接字)
type:指定使用的套接字的类型:SOCK_STREAM(字节流套接字) SOCK_DGRAM
protocol:如果套接字类型不是原始套接字,那么这个参数就为0
return:如果返回值>0 ,标示 Socket 创建成功!

2、int bind(int sockfd, struct sockaddr *myaddr, int addrlen)

sockfd:socket函数返回的套接字描述符
myaddr:是指向本地IP地址的结构体指针
myaddrlen:结构长度

struct sockaddr{unsigned short sa_family; //通信协议类型族AF_xxchar sa_data[14]; //14字节协议地址,包含该socket的IP地址和端口号
};
struct sockaddr_in{short int sin_family; //通信协议类型族unsigned short int sin_port; //端口号struct in_addr sin_addr; //IP地址unsigned char si_zero[8]; //填充0以保持与sockaddr结构的长度相同
};

3、int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen)

sockfd:socket函数返回套接字描述符
serv_addr:服务器IP地址结构指针
addrlen:结构体指针的长度
return:成功返回0,失败返回-1

4、int listen(int sockfd, int backlog)

sockfd:socket函数绑定bind后套接字描述符
backlog:设置可连接客户端的最大连接个数,当有多个客户端向服务器请求时,收到此值的影响。默认值20

5、int accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen)

sockfd:socket函数经过listen后套接字描述符
cliaddr:客户端套接字接口地址结构
addrlen:客户端地址结构长度

6、int send(int sockfd, const void *msg,int len,int flags)


7、int recv(int sockfd, void *buf,int len,unsigned int flags)

sockfd:socket函数的套接字描述符
msg:发送数据的指针
buf:存放接收数据的缓冲区
len:数据的长度,把flags设置为0
return:>0表示成功&#xff0c;返回实际发送或接受的字节数;&#61;0表示超时&#xff0c;对方主动关闭了连接过程;<0出错&#xff0c;此种情况可能出现过重情况,其中errno &#61;&#61; EINTR || errno &#61;&#61; EWOULDBLOCK || errno &#61;&#61; EAGAIN这三种是特殊情况&#xff0c;实际使用中表示继续正常接受数据即可。

服务端

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include int main(int argc, char *argv[])
{int fd, new_fd, struct_len, numbytes,i;struct sockaddr_in server_addr;struct sockaddr_in client_addr;char buff[BUFSIZ];server_addr.sin_family &#61; AF_INET;/*** 设置服务器Socket 的端口号;* 端口号的最大值 65535; 09~1024 是系统默认占用的端口号!不要设置!* 如果需要手动设置端口号: 一般设置 1024 ~ 65535 之间的值!**/server_addr.sin_port &#61; htons(8000);server_addr.sin_addr.s_addr &#61; INADDR_ANY;bzero(&(server_addr.sin_zero), 8);struct_len &#61; sizeof(struct sockaddr_in);fd &#61; socket(AF_INET, SOCK_STREAM, 0);// 进行连接确认while(bind(fd, (struct sockaddr *)&server_addr, struct_len) &#61;&#61; -1);printf("Bind Success!\n");while(listen(fd, 10) &#61;&#61; -1);printf("Listening....\n");printf("Ready for Accept,Waitting...\n");new_fd &#61; accept(fd, (struct sockaddr *)&client_addr, &struct_len);printf("accept return: %d\n", new_fd);printf("Get the Client~\n");numbytes &#61; send(new_fd,"Welcome to my server\n",21,0);while((numbytes &#61; recv(new_fd, buff, BUFSIZ, 0)) > 0){buff[numbytes] &#61; &#39;\0&#39;;printf("%s\n",buff);if(send(new_fd,buff,numbytes,0)<0){perror("write");return 1;}}close(new_fd);close(fd);return 0;
}

客户端

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include int main(int argc,char *argv[])
{int sockfd,numbytes;char buf[BUFSIZ];struct sockaddr_in their_addr;printf("break!");//如果得到返回值不为0&#xff0c;说明socket没创建成功&#xff0c;继续等待&#xff0c;与服务端无关while((sockfd &#61; socket(AF_INET,SOCK_STREAM,0)) &#61;&#61; -1);printf("We get the sockfd~\n");their_addr.sin_family &#61; AF_INET;their_addr.sin_port &#61; htons(8000);// 服务器 Socket 的 IP 地址their_addr.sin_addr.s_addr&#61;inet_addr("127.0.0.1");bzero(&(their_addr.sin_zero), 8);while(connect(sockfd,(struct sockaddr*)&their_addr,sizeof(struct sockaddr)) &#61;&#61; -1);// 当上面建立连接成功后&#xff0c;即connect()返回0&#xff0c;再调用connect()函数&#xff0c;返回就变成-1了printf("connect return: %d\n", connect(sockfd,(struct sockaddr*)&their_addr,sizeof(struct sockaddr)));printf("Get the Server~\n");numbytes &#61; recv(sockfd, buf, BUFSIZ,0);//接收服务器端信息 // 在接收到的字符串末尾添加一个0&#xff0c;表示终结&#xff0c;避免乱码buf[numbytes]&#61;&#39;\0&#39;; printf("buf: %s\n",buf);while(1){printf("Entersome thing:");scanf("%[^\n]%*c",buf);printf("scanf: %s\n", buf);numbytes &#61; send(sockfd, buf, strlen(buf), 0);printf("send numbytes: %d\n", numbytes);numbytes&#61;recv(sockfd,buf,BUFSIZ,0); printf("recv numbytes: %d\n", numbytes);buf[numbytes]&#61;&#39;\0&#39;; printf("received:%s\n",buf); }close(sockfd);return 0;
}

效果展示

先启动服务端&#xff0c;再启动客户端

客户端

在这里插入图片描述

服务端

在这里插入图片描述


推荐阅读
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
author-avatar
小样2502857665
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有