Linux_C_tcp/ip通信

目录

  • 代码
    • 相互收发
    • 文本交互
  • 遇到的问题

在这里插入图片描述

代码

相互收发

server代码

/**********
1、在服务器端接受消息时知道对方的IP和端口提示:bind出现:Address already in use    方法:netstat -nap查看 用kill -9 pid杀死
2、利用TCP实现文件传输
**********/#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <strings.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>#include<stdlib.h>//
#include<netinet/in.h>//int main(void)
{//建立套接字int server_fd=socket(AF_INET,SOCK_STREAM,0);if(server_fd==-1){perror("socket:");return -1;}//设置套接字可以使用本机ip端口,否则ip只能用127.0.0.0int on_soc = 1;if(setsockopt(server_fd,SOL_SOCKET,SO_REUSEADDR,&on_soc,sizeof(on_soc))<0){perror("fial to setsockopt");exit(1);}//绑定本机的IP和端口struct sockaddr_in saddr;saddr.sin_family=AF_INET;saddr.sin_port=htons(8888);    //设置端口saddr.sin_addr.s_addr=inet_addr("192.168.31.109"); //点分十进制-》换成32位的网络字节序二进制值int ret=bind(server_fd,(struct sockaddr *)&saddr,sizeof(saddr));if(ret==-1){perror("bind:");return -1;}//设置监听套接字(设置同时来链接数)ret=listen(server_fd,4);		//server_fd设置为监听套接字if(ret==-1){perror("listen:");return -1;}//等待对端链接struct sockaddr_in client_buf;socklen_t len = sizeof(client_buf);int client_fd = accept(server_fd,(struct sockaddr *)&client_buf,&len);   //成功返回对端的文件描述符if(-1 == client_fd){perror("accept:");return -1;}//显示对端的ip和端口printf("对端的ip为:%s\n",inet_ntoa(client_buf.sin_addr));printf("对端的port为:%d\n",ntohs(client_buf.sin_port));while(1){//接收数据char buffer1[20];memset(buffer1,0,sizeof(buffer1));// int len_rec = recv(client_fd,buffer1,sizeof(buffer1),0);int len_rec = read(client_fd,buffer1,sizeof(buffer1));if(len_rec > 0){printf("客户端发来消息: %s\n",buffer1);write(client_fd,buffer1,sizeof(buffer1));}if(len_rec == 0){printf("连接断开\n");break;}if(len_rec < 0){perror("faile to read \n");break;}}
/***********************	//文件操作int fd=open("b.txt",O_RDWR | O_CREAT,0777);if(-1 == fd){printf("open err!\n");return -1;}char buf[20] = {0};while(1){//第一题//	bzero(buf, 20);//	read(client_fd, buf, 20);//	printf("buf:%s\n", buf);//第二题bzero(buf, 20);read(client_fd, buf, 20);printf("buf:%s\n", buf);if(!strcmp(buf, "exit"))break;write(fd,buf,strlen(buf));}
*********************/close(client_fd);close(server_fd);
}

client代码

/**********
1、在服务器端接受消息时知道对方的IP和端口提示:bind出现:Address already in use    方法:netstat -nap查看 用kill -9 pid杀死
2、利用TCP实现文件传输
**********/#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <strings.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#include<stdlib.h>//
#include<netinet/in.h>//#include<errno.h>
int main(void)
{//建立套接字int client_fd = socket(AF_INET, SOCK_STREAM, 0);if(-1 == client_fd){perror("socket");return -1;}//链接服务器struct sockaddr_in saddr;bzero(&saddr, sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_port = htons(8888);saddr.sin_addr.s_addr = inet_addr("192.168.31.109");int ret = connect(client_fd, (struct sockaddr *)&saddr, sizeof(saddr));if(-1 == ret){perror("connect");return -1;}int number =1;while(1){//发送数据char buffer1[20];sprintf(buffer1,"hi: %d",number++);send(client_fd,buffer1,strlen(buffer1)+1,0);//接收数据memset(buffer1,0,20);int len_rec = recv(client_fd,buffer1,sizeof(buffer1),0);if(len_rec > 0){printf("接收到服务器:%s\n",buffer1);}if(len_rec == 0){printf("连接断开\n");break;}				if(len_rec < 0){perror("faile to read \n");break;}sleep(1);}/***//文件操作int fd=open("a.txt",O_RDWR | O_CREAT,0777);if(-1 == fd){printf("open err!\n");return -1;}char fd_buf[20]={0};while(1){bzero(fd_buf,20);ret = read(fd, fd_buf, 20);  //读文件到缓冲区if(ret==0){write(client_fd,"exit", 20);break;}else{printf("fd_buf%s\n",fd_buf);write(client_fd, fd_buf, 20);}**/	/*bzero(fd_buf, 20);scanf("%s", fd_buf);write(client_fd, fd_buf, 20);printf("fd_buf:%s\n", fd_buf);if(!strcmp(fd_buf, "exit"))break;*///}close(client_fd);}

文本交互

server代码

/**********
1、在服务器端接受消息时知道对方的IP和端口提示:bind出现:Address already in use    方法:netstat -nap查看 用kill -9 pid杀死Server端bind本机IP地址使用INADDR_ANY
2、利用TCP实现文件传输
**********/#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <strings.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>int main(void)
{//建立套接字int server_fd=socket(AF_INET,SOCK_STREAM,0);if(server_fd==-1){perror("socket:");return -1;}//绑定本机的IP和端口struct sockaddr_in saddr;saddr.sin_family=AF_INET;saddr.sin_port=htons(7777);    //设置端口saddr.sin_addr.s_addr=inet_addr("192.168.31.109"); //点分十进制-》换成32位的网络字节序二进制值//这里的ip是服务端本机的ipint ret=bind(server_fd,(struct sockaddr *)&saddr,sizeof(saddr));if(ret==-1){perror("bind:");return -1;}//设置监听套接字(设置同时来链接数)ret=listen(server_fd,4);		//server_fd设置为监听套接字if(ret==-1){perror("listen:");return -1;}//等待对端链接struct sockaddr_in client_buf;socklen_t len = sizeof(client_buf);int client_fd = accept(server_fd,(struct sockaddr *)&client_buf,&len);   //成功返回对端的文件描述符if(-1 == client_fd){perror("accept:");return -1;}//显示对端的ip和端口printf("对端的ip为:%s\n",inet_ntoa(client_buf.sin_addr));printf("对端的port为:%d\n",ntohs(client_buf.sin_port));//文件操作int fd=open("b.txt",O_RDWR | O_CREAT,0777);if(-1 == fd){printf("open err!\n");return -1;}char buf[20] = {0};while(1){//第一题/*bzero(buf, 20);read(client_fd, buf, 20);printf("buf:%s\n", buf);*///第二题bzero(buf, 20);read(client_fd, buf, 20);printf("buf:%s\n", buf);if(!strcmp(buf, "exit"))break;write(fd,buf,strlen(buf));}close(client_fd);close(server_fd);
}

client代码

/**********
1、在服务器端接受消息时知道对方的IP和端口提示:bind出现:Address already in use    方法:netstat -nap查看 用kill -9 pid杀死
2、利用TCP实现文件传输
**********/#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <strings.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main(void)
{//建立套接字int client_fd = socket(AF_INET, SOCK_STREAM, 0);if(-1 == client_fd){perror("socket");return -1;}//链接服务器struct sockaddr_in saddr;bzero(&saddr, sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_port = htons(7777);saddr.sin_addr.s_addr = inet_addr("192.168.31.109");int ret = connect(client_fd, (struct sockaddr *)&saddr, sizeof(saddr));if(-1 == ret){perror("connect");return -1;}//文件操作int fd=open("a.txt",O_RDWR | O_CREAT,0777);if(-1 == fd){printf("open err!\n");return -1;}char fd_buf[20]={0};while(1){bzero(fd_buf,20);ret = read(fd, fd_buf, 20);  //读文件到缓冲区if(ret==0){write(client_fd,"exit", 20);break;}else{printf("fd_buf%s\n",fd_buf);write(client_fd, fd_buf, 20);}/*bzero(fd_buf, 20);scanf("%s", fd_buf);write(client_fd, fd_buf, 20);printf("fd_buf:%s\n", fd_buf);if(!strcmp(fd_buf, "exit"))break;*/}close(client_fd);}

遇到的问题

1.Connection refused: connect服务端没有开启
2.gcc指令使用错误示范:gcc -c server.c -o server.out,加-c是不对的。
3.bind函数出现Cannot assign requested address

方法一:通过netstat -nap查看当前的状态,的确看到很多TIME_WAIT状态的连接。可以通过pid 用命令 kill -9  pid,杀死处于TIME_WAIT状态的进程。问题二:因为我的测试是以window当服务器,Ubuntu当客户端,所以需要用到桥接技术,让两个系统在一个网段里面。那么出现bind的错误很有可能是你的网络的问题。我自己在测试的时候,试了很多种方法,还能ping通,但是网络这一块还是有点问题,还是出现bind错误。
import socket
#创建服务端的socket对象socketserver
socketserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "192.168.31.24"
port = 8000
#绑定地址(包括ip地址会端口号)
socketserver.bind((host, port))
#设置监听
socketserver.listen(5)
#等待客户端的连接
#注意:accept()函数会返回一个元组
#元素1为客户端的socket对象,元素2为客户端的地址(ip地址,端口号)
clientsocket,addr = socketserver.accept()#while循环是为了能让对话一直进行,直到客户端输入q
while True:#接收客户端的请求recvmsg = clientsocket.recv(1024)#把接收到的数据进行解码strData = recvmsg.decode("utf-8")#判断客户端是否发送q,是就退出此次对话if strData=='q':breakprint("收到:"+strData)msg = input("回复:")#对要发送的数据进行编码clientsocket.send(msg.encode("utf-8"))
import socket
#创建一个客户端的socket对象
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#设置服务端的ip地址
host = "192.168.31.24"
#设置端口
port = 8000
#连接服务端
client.connect((host, port))#while循环是为了保证能持续进行对话
while True:#输入发送的消息sendmsg = input("请输入:")#如果客户端输入的是q,则停止对话并且退出程序if sendmsg=='q':breaksendmsg = sendmsg#发送数据,以二进制的形式发送数据,所以需要进行编码client.send(sendmsg.encode("utf-8"))msg = client.recv(1024)#接收服务端返回的数据,需要解码print(msg.decode("utf-8"))
#关闭客户端
client.close()

4.Cannot assign requested address解决办法
链接: Cannot assign requested address

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/32982.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

法大大Luke:打造深度生态,实现联合创新

4月26日&#xff0c;国内领先的电子合同和电子签云服务平台法大大举办了以“数智‘签’引&#xff0c;万物生长”为主题的春季产品发布会&#xff0c;并推出全新一代数智化签约管理平台。该平台型产品经过2年半的调研分析及打磨验证&#xff0c;聚焦新的市场环境下企业、组织、…

在阿里6年,但今年这情况,劝大家还是多一手准备吧

大家期待的经济繁荣&#xff0c;没有来。 往年的金三银四&#xff0c;跳槽涨薪&#xff0c;也没有来。 来了的&#xff0c;是大公司裁员的消息频频爆出。 来了的&#xff0c;是ChatGPT&#xff0c;第一批受到影响的人已经失业了。 而且你有没有发现&#xff0c;它平时没什么…

【企业架构设计实战】大数据架构设计

目录 数据架构概述 什么是数据? 什么是数据架构

【企业架构设计实战】5 大数据架构设计

数据架构概述 什么是数据? 一个企业的数字化核心是数据,数据化的价值依赖于数据的标准和质量,数据对一个企业来说至关重要,它也是整个信息化建设及企业架构的核心。数据具有多样性,有结构化的、非结构化的,与业务相关的、与系统相关的,企业内部的、企业外部的等。 从数据…

找工作之前问问自己做好这些准备以及知道这些面试题的答案了吗?

根据回忆写下的面试要点&#xff0c;都是比较常见的问题。大家可以对照回答下&#xff0c;不清楚的可以查下资料补充下。 今年虽然疫情开放了&#xff0c;但是现在的Android开发的市场行情明显明显比之前稳定了许多&#xff0c;现在大厂疯狂裁员&#xff0c;小公司要求还挺高的…

OceanBase CTO杨传辉:放手去干,这行没有35岁危机

近日&#xff0c;OceanBase CTO 杨传辉做客 CSDN 《开谈&#xff1a;中国开源数据库新格局》栏目&#xff0c;中达金桥资深数据库专家卢东明对话杨传辉等中国领先数据库厂商从业者。对话开场&#xff0c;杨传辉给 OceanBase 打了 3 个标签&#xff1a;分布式、性价比、HTAP&…

GPT 大模型的应用路线图:可控性是最强路标 | The Roadmap of Generative AI

目录 生成式AI的应用路线图:可控性是最强路标 | The Roadmap of Generative AI 生成式AI的应用场景在哪里</

AI应用路线图:可控性是最强路标

生成式AI的可控性越强&#xff0c;对市场和产业的颠覆性就越大&#xff01; 作者 | 王咏刚、童超 责编 | 夏萌 生成式 AI 的应用场景在哪里 Stable Diffusion、ChatGPT等生成式AI技术&#xff08;Generative AI&#xff09;在2023年上半年吸引了IT创投圈的最多注意力。当我们稍…

抖音根据关键词取商品列表 API 返回值说明

请求参数&#xff1a;q连衣裙&page1&sort 参数说明&#xff1a;q:关键词, filter:搜索类型&#xff1a;filtervideo 搜索视频、filtergoods 搜索商品、filteruser 搜索用户, page:页数 sort:排序(目前只视频可排序):sortnew 最新发布 sortcredit 最多点赞 sortbid 综合…

简单对接抖音小店的接口

最近公司需要对接抖音小店的接口。然后其实对接起来还是蛮简单的&#xff0c;不过自己阅读文档的能力还有点问题&#xff0c;所以这里记录一下开发遇到的问题。 文档地址&#xff1a;https://op.jinritemai.com/docs/guide-docs/6/14 首先是需要准备的配置。 抖音小店的整个流…

获得抖音商品详情 API 返回值说明

请求地址: https://api-gw.onebound.cn/douyin/item_get 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_sear…

抖音关键词月搜查询( API 返回值说明)

为了进行电商平台API开发&#xff0c;我们需要做下面几件事情。 1&#xff09;开发者注册一个账号 2&#xff09;然后在平台应用注册一个应用程序键&#xff08;App Key) 。 3&#xff09;下载平台API的SDK并掌握基本的API基础知识和调用 4&#xff09;利用SDK接口和对象&a…

抖音跳转微信加好友功能实现解析

抖音现在毫无疑问的成为了大众喜闻乐见、爱不释手的娱乐利器&#xff0c;工作闲暇、茶余饭后、候车排队等等只要有空&#xff0c;就会随时随刻随手划拉&#xff0c;每个人都沉浸在这虚拟和现实的交互之中&#xff0c;乐不思蜀&#xff0c;忘乎所以&#xff0c;不能自拔。 抖音…

研究抖音的,点进来

作者&#xff1a;杨浩 全文共 5183 字&#xff0c;阅读需要 11 分钟 ———— / BEGIN / ———— 抖音之火&#xff0c;我们可能从主观上会听到很多声音&#xff0c;比如&#xff1a;“中毒了&#xff0c;我每天晚上要刷2个小时”&#xff0c;、昨晚刷到凌晨4点”、“我家小女…

获取详情API接口(抖音)

API接口名称&#xff1a; item_get - 获得抖音商品详情 响应参数 Version: Date: 名称类型必须示例值描述itemitem[]0宝贝详情数据 注册申请试用&#xff1a; 点击注册 请求参数&#xff1a;num_iid3514453298386183303 参数说明&#xff1a;num_iid:抖音商品ID 请求示例…

清爽聊天无多余功能!抖音聊天工具上线

&#x1f447;&#x1f447;关注后回复 “进群” &#xff0c;拉你进程序员交流群&#x1f447;&#x1f447; 来源丨电脑报 https://mp.weixin.qq.com/s/iRwO_iot8DSfN5PZbbKMDA 近日&#xff0c;抖音在官网上线了一款桌面端聊天软件“抖音聊天”&#xff0c;将支持 windows 7…

今日推荐一款实用的搜题小程序,题多多搜题

为什么要用小程序 1、不用安装&#xff0c;即开即用&#xff0c;节省流量&#xff0c;节约安装时间&#xff0c;而且不占用桌面&#xff1b; 2、功能上更为集中、单一&#xff0c;降低用户的使用难度&#xff0c;减少手机的过度使用。 小程序怎么找 现在大厂都已经推出了各…

大学c语言作业用什么搜题比较好,快速查找题库_什么手机软件可以把题库输入进去然后输入关键字可以查找点道题_淘题吧...

❶ 什么手机软件可以把题库输入进去。然后输入关键字可以查找点道题 用试题通啊&#xff0c;这款软件可以的&#xff0c;题库录入过后搜索关键字就能看到答案和题目了。 ❷ 如何快速寻找题库中的答案我有份题库&#xff0c;答题时如何快速的找到答案 大家谁也好的方法 用啥软件…

chatgpt赋能python:Python学习者必备:如何使用Python搜题

Python学习者必备&#xff1a;如何使用Python搜题 Python是一种非常强大的编程语言&#xff0c;在各种行业和领域都有广泛的应用。其中&#xff0c;Python在搜索引擎优化中的作用越来越受到重视。本篇文章将介绍如何使用Python来实现搜题&#xff0c;以及如何将Python应用到搜…

AI、OpenAI、MidJourney发展史

1探索ChatGPT&#xff0c;协助工作学习创作。加入「阿杰与AI」公众号&#xff0c;一同探讨&#xff0c;一同成长&#xff0c;比他人更进一步。 1.AI、OpenAI、MidJourney发展史2.ChatGPT们对今后社会生活的影响3.目前市面比较好的AI产品介绍4.注册方式汇总5.针对初学者的 Chat…