初识TCP/IP网络编程

 学习自《TCP/IP网络编程》

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
void error_handling(char * message);int main(int argc,char *argv[])
{int sock;struct sockaddr_in serv_addr;char message[30];int str_len;if(argc!=3){printf("Usage : %s <IP> <port>\n",argv[0]);exit(1);}sock=socket(PF_INET,SOCK_STREAM,0);if(sock == -1)error_handling("socket() error");memset(&serv_addr,0,sizeof(serv_addr));serv_addr.sin_family=AF_INET;serv_addr.sin_addr.s_addr=inet_addr(argv[1]);serv_addr.sin_port=htons(atoi(argv[2]));if(connect(sock,(struct sockaddr *)&serv_addr,sizeof(serv_addr))==-1)error_handling("connect() error!");str_len=read(sock,message,sizeof(message)-1);if(str_len==1)error_handling("read() error!");printf("Message from server : %s \n",message);close(sock);return 0;
}void error_handling(char *message)
{fputs(message,stderr);fputc('\n',stderr);exit(1);
}

服务端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
void error_handling(char * message);int main(int argc,char *argv[])
{int serv_sock;int clnt_sock;struct sockaddr_in serv_addr;struct sockaddr_in clnt_addr;socklen_t clnt_addr_size;char message[]="hello world!";if(argc!=2){printf("Usage: %s <port>\n",argv[0]);exit(1);}serv_sock=socket(PF_INET,SOCK_STREAM,0);if(serv_sock == -1)error_handling("socker() error");memset(&serv_addr,0,sizeof(serv_addr));serv_addr.sin_family=AF_INET;serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);serv_addr.sin_port=htons(atoi(argv[1]));if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1)error_handling("bind() error");if(listen(serv_sock,5)==-1)error_handling("listen() error");clnt_addr_size=sizeof(clnt_addr);clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_size);if(clnt_sock==-1)error_handling("accept() error");write(clnt_sock,message,sizeof(message));close(clnt_sock);close(serv_sock);return 0;
}void error_handling(char *message)
{fputs(message,stderr);fputc('\n',stderr);exit(1);
}

程序在Linux下运行,先启动服务端,再启动客户端

客户端会收到消息:Message from server : hello world!

#include <sys/socket.h>

int socket(int domain,int type,int protocol);

成功时返回文件描述符,失败时返回-1。

#include <sys/socket.h>

int bind(int sockfd,struct sockaddr *myaddr,socklen_t addrlen);

int listen(int sockfd,int backlog); 

int accept(int sockfd,struct sockaddr *addr,socklen_t * addrlen);

int connect(int sockfd,struct sockaddr * serv_addr,socklen_t addrlen); 

下面是在Windows下对应的程序:

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
void error_handling(char * message);int main(int argc,char *argv[])
{WSADATA wsaData;SOCKET sock;SOCKADDR_IN serv_addr;char message[30];int str_len;if(argc!=3){printf("Usage : %s <IP> <port>\n",argv[0]);exit(1);}if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)error_handling("WSAStartup() error!");sock=socket(PF_INET,SOCK_STREAM,0);if(sock == INVALID_SOCKET)error_handling("socket() error");memset(&serv_addr,0,sizeof(serv_addr));serv_addr.sin_family=AF_INET;serv_addr.sin_addr.s_addr=inet_addr(argv[1]);serv_addr.sin_port=htons(atoi(argv[2]));if(connect(sock,(SOCKADDR *)&serv_addr,sizeof(serv_addr))==SOCKET_ERROR)error_handling("connect() error!");str_len=recv(sock,message,sizeof(message)-1,0);if(str_len==1)error_handling("read() error!");printf("Message from server : %s \n",message);closesocket(sock);WSACleanup();return 0;
}void error_handling(char *message)
{fputs(message,stderr);fputc('\n',stderr);exit(1);
}

 服务器:

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>void error_handling(char * message);int main(int argc,char *argv[])
{WSADATA wsaData;SOCKET hServSock,hClntSock;SOCKADDR_IN servAddr,clntAddr;int szClntAddr;char message[]="Hello World";if(argc!=2){printf("Usage : %s <IP> <port>\n",argv[0]);exit(1);		}if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)error_handling((char*)"WSAStartup() error!");hServSock=socket(PF_INET,SOCK_STREAM,0);if(hServSock == INVALID_SOCKET)error_handling((char*)"socket() error");memset(&servAddr,0,sizeof(servAddr));servAddr.sin_family=AF_INET;servAddr.sin_addr.s_addr=htonl(INADDR_ANY);servAddr.sin_port=htons(atoi(argv[1]));if(bind(hServSock,(SOCKADDR *)&servAddr,sizeof(servAddr))==SOCKET_ERROR)error_handling((char*)"bind() error");if(listen(hServSock,5)==SOCKET_ERROR)error_handling((char*)"listen() error");szClntAddr=sizeof(clntAddr);hClntSock=accept(hServSock,(SOCKADDR*)&clntAddr,&szClntAddr);if(hClntSock==INVALID_SOCKET)error_handling((char*)"accept() error");send(hClntSock,message,sizeof(message),0);closesocket(hClntSock);closesocket(hServSock);WSACleanup();return 0;
}void error_handling(char *message)
{fputs(message,stderr);fputc('\n',stderr);exit(1);
}

结果:

 

 Linux平台与Windows平台下几乎没有太多差异。

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

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

相关文章

Codeforces Round 883 (Div. 3)

A. Rudolph and Cut the Rope 只需要按照钉子距离的高度 a i a_{i} ai​和绳子的长度 b i b_{i} bi​的差值进行排序即可 代码 int n; pii a[N]; bool cmp(pii a,pii b) {return a.x-a.y<b.x-b.y; }void solve() {cin>>n;for(int i1;i<n;i)cin>>a[i].x>…

【Linux】oh-my-zsh终端配置

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍oh-my-zsh终端配置。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&am…

深度学习不同数据增广方法的选用分析

一般情况下&#xff0c;可以将数据扩增方法分为单数据变形、多数据混合、学习数据分布规律生成新数据和学习增广策略等4 类方法。以上顺序也在一定程度上反映了数据增广方法的发展历程。如果与Shorten和Khoshgoftaar的成果对照&#xff0c;就图像数据而言&#xff0c;基于数据变…

CTFHub XSS DOM反射 WriteUp

前言&#xff1a;本文需要注册一个xss平台&#xff0c;以接收xss反弹回来的数据&#xff0c;请自己在互联网上寻找合适的xss平台 1. 构造闭合语句 根据题目提示&#xff0c;判断网站存在DOM xss漏洞 查看页面源代码&#xff0c;发现关键位置&#xff0c;其中CTFHub is very n…

用android studio 测试发行包

在google play 发行app&#xff0c;需要用bundle&#xff0c;而不是apk。 bundle 比apk 要小很多&#xff0c;比如我的app-release.aab 29,736 KB&#xff0c; 而app-release.apk 是62,305KB。这就是少了一半多。但是apk 直接复制就可以安装&#xff0c;bundle 需要上传google…

实例解释在lingo中使用集合模型

某部门有三个生产同一产品的工厂&#xff08;产地&#xff09;&#xff0c;生产的产品运往四个销售点&#xff08;销地&#xff09;出售&#xff0c;各个工厂的生产量、各销地的销量&#xff08;单位&#xff1a;吨&#xff09;、从各个工厂到各个销售点的单位运价&#xff08;…

【若依】框架搭建,前端向后端如何发送请求,验证码的实现,开启注册功能

若依框架 若依框架&#xff08;Ruoyi&#xff09;是一款基于Spring Boot和Spring Cloud的开源快速开发平台。它提供了一系列的基础功能和通用组件&#xff0c;能够帮助开发者快速构建企业级应用。若依框架采用了模块化的设计理念&#xff0c;用户可以选择需要的功能模块进行集…

ChatGPT炒股:批量自动提取股票公告中的表格并合并数据

首先&#xff0c;在ChatGPT中输入提示词&#xff1a; 写一段Python代码&#xff1a; F盘文件夹“新三板 2023年日常性关联交易20230704”中很多个PDF文件&#xff0c;用 Tabula提取这些PDF文件中第1页中的第2个表格&#xff0c;然后保存到表格文件中&#xff0c;文件标题名和…

springboot+echarts+mysql制作数据可视化大屏(滑动大屏)

作者水平低&#xff0c;如有错误&#xff0c;恳请指正&#xff01;谢谢&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 项目简单&#xff0c;适合大学生参考 分类专栏还有其它的可视化博客哦&#xff01; 专栏地址&#xff1a;https://blog.csdn.net/qq_559…

基于多案例系统学习防洪评价报告编制方法与水流数学模型建模(HECRAS、MIKE、EFDC、Delft3D、FVCOM、SWAT、SWMM等模型应用)

目录 ​专题一 《防洪评价报告编制导则解读河道管理范围内建设项目编制导则》&#xff08;SL/T808- 2021&#xff09;解读编制导则解读 专题二 防洪评价相关制度与解析 ★专题三 案例演练解析 专题四 防洪评价地形获取及常用计算实践 专题五 HEC-RAS软件原理及应用案例解析…

Redis 事务

是什么 官网&#xff1a;https://redis.io/docs/interact/transactions/ 可以一次执行多个命令&#xff0c;本质是一组命令的集合。一个事务中的所有命令都会序列化&#xff0c;按顺序地串行化执行而不会被其它命令插入&#xff0c;不许加塞。 能干嘛 一个队列中&#xff0c;…

springboot医院挂号小程序

医院挂号系统 springboot医院挂号系统小程序 java医院挂号小程序 技术&#xff1a; 基于springbootvue小程序医院挂号系统的设计与实现 运行环境&#xff1a; JAVA版本&#xff1a;JDK1.8 IDE类型&#xff1a;IDEA、Eclipse都可运行 数据库类型&#xff1a;MySql&#xff08;…