首页 > 系统相关 >用C++写一遍linux socket通信过程

用C++写一遍linux socket通信过程

时间:2022-11-22 12:44:15浏览次数:38  
标签:serv addr ERROR C++ linux sockfd include newsockfd socket

要想深刻理解一些技术的底层,我还是觉得非用用c/c++写一遍的比较好。这其中的原因相信懂的人都懂。回忆一下上学时候在c语言课堂上的激动劲,如今感觉对c的理解真的都是那时候打下的基础。

不说了,上代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

void error(const char *msg)
{
perror(msg);
exit(1);
}

int main(int argc, char *argv[])
{
int sockfd, newsockfd, portno;
socklen_t clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n;
if (argc < 2) {
fprintf(stderr,"ERROR, no port provided\n");
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(argv[1]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0)
error("ERROR on binding");
listen(sockfd,5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd,
(struct sockaddr *) &cli_addr,
&clilen);
if (newsockfd < 0)
error("ERROR on accept");
bzero(buffer,256);
n = read(newsockfd,buffer,255);
if (n < 0) error("ERROR reading from socket");
printf("Here is the message: %s\n",buffer);
n = write(newsockfd,"I got your message",18);
if (n < 0) error("ERROR writing to socket");
close(newsockfd);
close(sockfd);
return 0;
}

标签:serv,addr,ERROR,C++,linux,sockfd,include,newsockfd,socket
From: https://www.cnblogs.com/quick800/p/16914761.html

相关文章

  • 一步一图带你深入理解 Linux 物理内存管理
    1.前文回顾在上篇文章《深入理解Linux虚拟内存管理》中,笔者分别从进程用户态和内核态的角度详细深入地为大家介绍了Linux内核如何对进程虚拟内存空间进行布局以及......
  • linux服务器上,如何查看日志和查找问题?
    前言有些高频日志无法输出到数据库,走中间件异步到数据库可能会有延迟。所以,有时候需要将日志直接输出到控制台,混合了大多系统info后,要如何定位呢。姿势cpxxx.logtmpcattm......
  • Linux之挂载新的硬盘
    1.查看磁盘的信息1.1在命令行输入lsblk(记忆:老师不离开的首字母)[root@MYHOST-821~]#lsblk-fNAMEFSTYPELABELUUID......
  • linux screen 常用
    安装 yuminstallscreen常用命令Use:screen[-opts][cmd[args]]or:screen-r[host.tty]Options:-4ResolvehostnamesonlytoIPv4address......
  • C++11
    longlong超长整形 C++11longlong超长整形详解(biancheng.net)    待更。。。......
  • php-socket
    网络中是如何通信数据传输?ip+端口+协议实现网络进程之间的通信,几乎所有的应用程序都是采用socket,“一切皆socket”。HTTPTCPSOCKET区别Http协议:对应于应用层。Http协......
  • 【C++/STL】0.容器概述
    文章目录​​一、容器分类​​​​(1)序列性容器​​​​(2)关联式容器​​​​(3)容器适配器​​​​二、容器共性​​​​三、容器比较​​一、容器分类(1)序列性容器​​序列式容......
  • 【C++/STL】2. vector向量
    vector与常用的数组类似,占用连续内存空间,对随机存取支持很好。可以类似数组用下标访问,也可以类似字符串用​​vector.at()​​成员函数访问vector是尾部开口设计,类似栈。从......
  • C/C++中拆分long/float/double等数据并重新组合的方法
    在嵌入式编程时,常常会遇到需要做数据通信的场景。单片机往往只支持一次8位的数据传递,为了传输较长的数据类型,只能先在主机将数据拆分,再在从机重新组合,这里介绍一些实用的数......
  • 【C++】使用boost库的split函数分割字符串
    1#include<iostream>2#include<vector>3#include<boost/algorithm/string.hpp>45intmain(constintargc,constchar*argv[])6{7std::vect......