热门标签 | 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;再启动客户端

客户端

在这里插入图片描述

服务端

在这里插入图片描述


推荐阅读
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • SecureCRT是一款功能强大的终端仿真软件,支持SSH1和SSH2协议,适用于在Windows环境下高效连接和管理Linux服务器。该工具不仅提供了稳定的连接性能,还具备丰富的配置选项,能够满足不同用户的需求。通过SecureCRT,用户可以轻松实现对远程Linux系统的安全访问和操作。 ... [详细]
  • 本文详细介绍了在Windows XP系统中安装和配置Unix打印服务的方法,以支持远程行式打印机(LPR)功能。对于同时使用Windows 2000 Server打印服务器和Unix打印服务器的网络环境,该指南提供了实用的步骤和配置建议,确保不同平台之间的兼容性和高效打印。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 思科IOS XE与ISE集成实现TACACS认证配置
    本文详细介绍了如何在思科IOS XE设备上配置TACACS认证,并通过ISE(Identity Services Engine)进行用户管理和授权。配置包括网络拓扑、设备设置和ISE端的具体步骤。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 线程能否先以安全方式获取对象,再进行非安全发布? ... [详细]
  • Linux下MySQL 8.0.28安装指南
    本文详细介绍了在Linux系统上安装MySQL 8.0.28的步骤,包括下载数据库、解压数据包、安装必要组件和启动MySQL服务。 ... [详细]
  • 本文详细介绍了在 Ubuntu 系统上搭建 Hadoop 集群时遇到的 SSH 密钥认证问题及其解决方案。通过本文,读者可以了解如何在多台虚拟机之间实现无密码 SSH 登录,从而顺利启动 Hadoop 集群。 ... [详细]
  • 详解 Qt 串口通信程序全程图文 (4)
    Qt串口通信程序全程图文是本文介绍的内容,本文一开始先讲解对程序的改进,在文章最后将要讲解一些重要问题。1、在窗口中加入一些组合框ComboBox&# ... [详细]
  • 如何使用 `org.opencb.opencga.core.results.VariantQueryResult.getSource()` 方法及其代码示例详解 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • 微信小程序实现类似微博的无限回复功能,内置云开发数据库支持
    本文详细介绍了如何利用微信小程序实现类似于微博的无限回复功能,并充分利用了微信云开发的数据库支持。文中不仅提供了关键代码片段,还包含了完整的页面代码,方便开发者按需使用。此外,HTML页面中包含了一些示例图片,开发者可以根据个人喜好进行替换。文章还将展示详细的数据库结构设计,帮助读者更好地理解和实现这一功能。 ... [详细]
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社区 版权所有