当前位置:网站首页>作业8.9 构建TCP协议的服务器
作业8.9 构建TCP协议的服务器
2022-08-10 12:40:00 【不知名大学生M】
构建TCP协议的服务器
实现代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
//打印错误新的宏函数
#define ERR_MSG(msg) do{
\ fprintf(stderr, " __%d__ ", __LINE__);\ perror(msg);\ }while(0)
#define PORT 8888 //1024~49151
#define IP "192.168.31.96" //本机IP,用ifconfig查看
int main(int argc, const char *argv[])
{
//创建流式套接字
int sfd = socket(AF_INET, SOCK_STREAM, 0);
if(sfd < 0)
{
ERR_MSG("socket");
return -1;
}
printf("create socket success\n");
//填充地址信息结构体,真实的地址信息结构体与协议族相关
//AF_INET,所以详情请看man 7 ip
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT); //网络字节序的端口号
sin.sin_addr.s_addr = inet_addr(IP); //网络字节序的IP地址
//将地址信息结构体绑定到套接字上
if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) < 0)
{
ERR_MSG("bind");
return -1;
}
printf("bind success\n");
//将套接字设置为被动监听状态,让内核去监听是否有客户端连接;
if(listen(sfd, 10) < 0)
{
ERR_MSG("listen");
return -1;
}
printf("listen success\n");
struct sockaddr_in cin;
socklen_t addrlen = sizeof(cin);
//从已完成连接的队列头中,取出一个客户端的信息,创建生成一个新的套接字文件描述符,
//该文件描述符才是与客户端通信的文件描述符!!!
int newfd = accept(sfd, (struct sockaddr*)&cin, &addrlen);
if(newfd < 0)
{
perror("accept");
return -1;
}
//网络字节序的IP-->点分十进制 网络字节序的port--->本机字节序
printf("[%s : %d] newfd = %d\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port),newfd);
char buf[128] = "";
ssize_t res = 0;
while(1)
{
bzero(buf, sizeof(buf));
//循环接收
res = recv(newfd, buf, sizeof(buf), 0);
if(res < 0)
{
ERR_MSG("recv");
return -1;
}
else if(0 == res)
{
printf("[%s : %d] newfd = %d客户端退出\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port),newfd);
break;
}
printf("[%s : %d] newfd = %d : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port),newfd, buf);
}
close(sfd);
close(newfd);
return 0;
}
运行结果


边栏推荐
- A unit test report for CRM One Order Application log
- Have you guys encountered this problem?MySQL 2.2 and 2.3-SNAPSHOT are like this, it seems to be
- sprintboot项目通过interceptor和filter实现接入授权控制
- LeetCode简单题之合并相似的物品
- 跨域的五种解决方案
- Jenkins修改端口号, jenkins容器修改默认端口号
- 3DS MAX 批量导出文件脚本 MAXScript 带界面
- M²BEV: Multi-Camera Joint 3D Detection and Segmentation with Unified Bird’s-Eye View Representation
- wirshark 常用操作及 tcp 三次握手过程实例分析
- odps sql 不支持 unsupported feature CREATE TEMPORARY
猜你喜欢

Short read or OOM loading DB. Unrecoverable error, aborting now

Merge similar items in LeetCode simple questions

Guidelines for Sending Overseas Mail (2)

生成树协议STP(Spanning Tree Protocol)

LeetCode中等题之比较版本号

Open Office XML 格式里如何描述多段具有不同字体设置的段落

Redis上云迁移实践

Polygon zkEVM工具——PIL和CIRCOM

mSystems | Zhongnong Wang Jie Group Reveals the Mechanisms Affecting Soil "Plastic Interstitial" Microbial Communities

wirshark 常用操作及 tcp 三次握手过程实例分析
随机推荐
R语言实战应用案例:论文篇(一)-特殊柱形图绘制
BEVDet4D: Exploit Temporal Cues in Multi-camera 3D Object Detection Paper Notes
在web页面播放rtsp流视频(webrtc)
Interface Automation Testing Basics
把相亲角搬到海外,不愧是咱爸妈
A can make large data clustering method of 2000 times faster, don't poke
生成树协议STP(Spanning Tree Protocol)
一种能让大型数据聚类快2000倍的方法,真不戳
A unit test report for CRM One Order Application log
燃炸!字节跳动成功上岸,只因刷爆LeetCode算法面试题
I would like to ask the big guys, how to solve this error when cdc oracle initializes a 3 million table task running
rpn:def concat_box_prediction_layers
Codeforces Round #276 (Div. 1) B. Maximum Value
神经网络可视化有3D版本了,美到沦陷!(已开源)
MYSQL误删数据恢复
表中存在多个索引问题? - 聚集索引,回表,覆盖索引
Keithley DMM7510精准测量超低功耗设备各种运作模式功耗
Merge similar items in LeetCode simple questions
Reversing words in a string in LeetCode
Prada, big show?In the yuan in the universe that!