TCP相关代码

TCP 基础代码

//tcp_server.c
#include<stdio.h>
#include<error.h>
#include<sys/types.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<error.h>int Startup(char* ip, int port)
{printf("port: %d\n", port);struct sockaddr_in local;local.sin_family = AF_INET;local.sin_port = htons(port);local.sin_addr.s_addr = inet_addr(ip);//设置套接字int sock = socket(AF_INET, SOCK_STREAM, 0);if(sock == -1){perror("socket\n");exit(2);}//绑定if(bind(sock, (struct sockaddr*)&local, sizeof(local)) < 0){perror("bind\n");exit(3);}//监听int ret = listen(sock, 5);if(ret == -1){perror("listen_sock\n");exit(3);}return sock;
}void Server(int new_sock, char* ip, int port)
{char buf[1024];while(1){buf[0] = 0;int s = read(new_sock, buf, sizeof(buf));if(s > 0){buf[s] = 0;printf("[%s, %d] say# %s\n", ip, port, buf);write(new_sock, buf, strlen(buf));}else if(s == 0){printf("[%s, %d] quit\n", ip, port);exit(4);}else{perror("read\n");exit(5);}}
}int main(int argc, char* argv[])
{if(argc != 3){printf("Usage: %s [ip] [port]\n", argv[0]);exit(1);}//此时的套接字已经是监听套接字int listen_sock = Startup(argv[1], atoi(argv[2]));printf("listen and bind is sucessful!\n");//建立连接struct sockaddr_in peer;while(1){socklen_t len = sizeof(peer);//此时的套接字已经是监听套接字int new_sock = accept(listen_sock, (struct sockaddr*)&peer, &len);//此时返回的这个套接字就是负责服务的套接字if(new_sock == -1){printf("accept is error!\n");continue;}char* ip = inet_ntoa(peer.sin_addr);int port = ntohs(peer.sin_port);printf("get a new connet ip is %s, port is %d...\n", ip, port);//服务Server(new_sock, ip, port);//关闭文件描述符}return 0;
}
//tcp_client.c
#include<stdio.h>
#include<error.h>
#include<sys/types.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<error.h>int main(int argc, char* argv[])
{if(argc != 3){printf("Usage %s [ip], [port]\n", argv[0]);exit(1);}//建立套接字int sock = socket(AF_INET, SOCK_STREAM, 0);if(sock == -1){perror("socket\n");exit(2);}struct sockaddr_in server;server.sin_family = AF_INET;server.sin_addr.s_addr = inet_addr(argv[1]);server.sin_port = htons(atoi(argv[2]));//发起连接if(connect(sock, (struct sockaddr*)&server, sizeof(server)) == -1){perror("connect\n");exit(3);}while(1){printf("Please enter#");fflush(stdout);char buf[1024];buf[0] = 0;int s = read(0, buf, sizeof(buf));if(s > 0){buf[s - 1] = 0;if(strcmp(buf, "quit") == 0){printf("client quit!\n");}write(sock, buf, strlen(buf));s = read(sock, buf, sizeof(buf) - 1);buf[s] = 0;printf("Server Echo#%s\n", buf);}}close(sock);return 0;
}

这里写图片描述
这里写图片描述

TCP 多进程多线程版本

//server.c
#include<stdio.h>
#include<error.h>
#include<sys/types.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<error.h>int main(int argc, char* argv[])
{if(argc != 3){printf("Usage %s [ip], [port]\n", argv[0]);exit(1);}//建立套接字int sock = socket(AF_INET, SOCK_STREAM, 0);if(sock == -1){perror("socket\n");exit(2);}struct sockaddr_in server;server.sin_family = AF_INET;server.sin_addr.s_addr = inet_addr(argv[1]);server.sin_port = htons(atoi(argv[2]));//发起连接if(connect(sock, (struct sockaddr*)&server, sizeof(server)) == -1){perror("connect\n");exit(3);}while(1){printf("Please enter#");fflush(stdout);char buf[1024];buf[0] = 0;int s = read(0, buf, sizeof(buf));if(s > 0){buf[s - 1] = 0;if(strcmp(buf, "quit") == 0){printf("client quit!\n");}write(sock, buf, strlen(buf));s = read(sock, buf, sizeof(buf) - 1);buf[s] = 0;printf("Server Echo#%s\n", buf);}}close(sock);return 0;
}
//client.c
#include<stdio.h>
#include<error.h>
#include<sys/types.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<error.h>int main(int argc, char* argv[])
{if(argc != 3){printf("Usage %s [ip], [port]\n", argv[0]);exit(1);}//建立套接字int sock = socket(AF_INET, SOCK_STREAM, 0);if(sock == -1){perror("socket\n");exit(2);}struct sockaddr_in server;server.sin_family = AF_INET;server.sin_addr.s_addr = inet_addr(argv[1]);server.sin_port = htons(atoi(argv[2]));//发起连接if(connect(sock, (struct sockaddr*)&server, sizeof(server)) == -1){perror("connect\n");exit(3);}while(1){printf("Please enter#");fflush(stdout);char buf[1024];buf[0] = 0;int s = read(0, buf, sizeof(buf));if(s > 0){buf[s - 1] = 0;if(strcmp(buf, "quit") == 0){printf("client quit!\n");}write(sock, buf, strlen(buf));s = read(sock, buf, sizeof(buf) - 1);buf[s] = 0;printf("Server Echo#%s\n", buf);}}close(sock);return 0;
}

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

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

相关文章

几种并发服务器模型的实现:多线程,多进程,select,poll,epoll

http://www.cnblogs.com/wj9012/p/3879605.html 客户端使用select模型&#xff1a; 1 #include <stdio.h>2 #include <stdlib.h>3 #include <string.h>4 #include <errno.h>5 #include <sys/types.h>6 #include <sys/socket.h>7 #include …

linux进程通信---几个发送信号的函数(kill,raise,alarm,pause)

http://blog.csdn.net/zzyoucan/article/details/9235685 信号&#xff1a;信号是unix中最古老的进程通信的一种方式&#xff0c;他是软件层次上对中断机制的模拟&#xff0c;是一种异步通信方式&#xff0c;信号可以实现用户空间进程和内核空间进程的交互&#xff0c;内核进程…

Linux epoll模型

http://www.cnblogs.com/venow/archive/2012/11/30/2790031.html 定义&#xff1a; epoll是Linux内核为处理大批句柄而作改进的poll&#xff0c;是Linux下多路复用IO接口select/poll的增强版本&#xff0c;它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利…

Linux IO模式及 select、poll、epoll详解

https://segmentfault.com/a/1190000003063859 同步IO和异步IO&#xff0c;阻塞IO和非阻塞IO分别是什么&#xff0c;到底有什么区别&#xff1f;不同的人在不同的上下文下给出的答案是不同的。所以先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。一 概念…

mysql思维导图

后期会不断进行更新

C++第一节课

C数据类型 几个概念 命名空间是C标准库引入的,其中命名空间可以解决变量冲突问题,当出现局部变量和全局变量同名的时候, 局部变量优先被访问.同时命名空间的格式如同一下代码 namespace name1 { int a 0; }namespace name2 { int a 2; } 注意C中的所有组件都是在一个叫做s…

【C/C++】关键字static

http://blog.csdn.net/woxiaohahaa/article/details/51014224 参考自&#xff1a;http://www.cnblogs.com/biyeymyhjob/archive/2012/07/19/2598815.html &#xff08;华山大师兄&#xff09; 这里我们只讨论了C语言的static 首先我们回顾一下各种变量在内存中的位置&#xff1…

IO多路复用之epoll总结

http://www.cnblogs.com/Anker/p/3263780.html 1、基本知识 epoll是在2.6内核中提出的&#xff0c;是之前的select和poll的增强版本。相对于select和poll来说&#xff0c;epoll更加灵活&#xff0c;没有描述符限制。epoll使用一个文件描述符管理多个描述符&#xff0c;将用户关…

3_V1-类和对象 -- 默认成员函数

定义一个日期类 #include <iostream> #include <assert.h> using namespace std;class Date { public:void Display(); private:int _year;int _month;int _day; }; 注意: 在定义一个类的时候往往会将其成员变量定义为私有,成员函数定义为公有.这是为了达到软件…

HDU - 2973威尔逊定理

核心问题就是那个等式 我们观察到等式可以写成(n-1)!-1/n-[(n-1)!/n]的形式&#xff0c;这样就应该联想到威尔逊定理了。 回顾一下威尔逊定理的内容&#xff1a;当且仅当n为素数的时候n|(n-1)!-1&#xff0c;n为合数且大于4的时候n|(n-1)!【参见威尔逊定理的证明】 对于这个…

linux网络编程之posix 线程(四):posix 条件变量与互斥锁 示例生产者--消费者问题

http://blog.csdn.net/jnu_simba/article/details/9129939 一、posix 条件变量 一种线程间同步的情形&#xff1a;线程A需要等某个条件成立才能继续往下执行&#xff0c;现在这个条件不成立&#xff0c;线程A就阻塞等待&#xff0c;而线程B在执行过程中使这个条件成立了&#x…

3-V2-类和对象 -- const内联 静态成员 友元

const修饰成员函数 在成员函数后面加一个const, const修饰this指针指向的对象, 保证调用这个const成员函数的对象在函数内不会被改变 注意:成员函数如果不修改成员变量,则加上const,成员函数如果要修改成员变量,此时就不能给其加上const修饰了 1.const对象不能调用非const…

C语言 二级指针内存模型混合实战

http://www.cnblogs.com/zhanggaofeng/p/5485833.html //二级指针内存模型混合实战 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>//将内存模型①和内存模型②的数据拷贝到内存模型③ char ** threemodel(ch…

Linux 网络编程八(epoll应用--大并发处理)

http://www.cnblogs.com/zhanggaofeng/p/5901316.html //头文件 pub.h #ifndef _vsucess#define _vsucess#ifdef __cplusplus extern "C" {#endif //服务器创建socket int server_socket(int port);//设置非阻塞 int setnonblock(int st);//接收客户端socket int ser…

【数据结构与算法】内部排序之三:堆排序(含完整源码)

转载请注明出处&#xff1a;http://blog.csdn.net/ns_code/article/details/20227303 前言 堆排序、快速排序、归并排序&#xff08;下篇会写这两种排序算法&#xff09;的平均时间复杂度都为O&#xff08;n*logn&#xff09;。要弄清楚堆排序&#xff0c;就要先了解下二叉堆这…

模线性方程(中国剩余定理+扩展中国剩余定理)

已知一系列除数和模数,求最小的满足条件的数 我们先考虑一般的情况&#xff0c;即模数不互质。&#xff08;扩展中国剩余定理&#xff09; 我们考虑两个方程的情况 x%MR xk1∗MRxk1 * MRxk1∗MR x%mr xk2∗mrxk2 * mrxk2∗mr 所以k1∗MRk2∗mrk1 * MRk2 * mrk1∗MRk2∗mr 即…

【数据结构】(面试题)使用两个栈实现一个队列(详细介绍)

http://blog.csdn.net/hanjing_1995/article/details/51539578 使用两个栈实现一个队列 思路一&#xff1a; 我们设定s1是入栈的&#xff0c;s2是出栈的。 入队列&#xff0c;直接压到s1即可 出队列&#xff0c;先把s1中的元素倒入到s2中&#xff0c;弹出s2中的栈顶元素&#x…

C++::探索对象模型

前面我们已经知道, 在没有虚函数的时候, 对象的大小就是对应的成员变量的大小, 而成员函数不会占用对象的空间, 今天我们来讨论一下, 当类中定义了虚函数的时候, 此时对象的大小以及对象模型 非继承下的对象模型 class Base { public:virtual void func1(){cout << &qu…

软件测试相关概念

什么叫软件测试 软件测试就是测试产品没有错误,同时又证明软件是可以正确运行的 测试和调试的区别 调试一般都在开发期间 ,测试是伴随着整个软件的生命周期, 调试是发现程序中问题并且解决问题, 测试是发现程序中的缺陷 软件测试的目的和原则 目的:验证软件有没有问题 原…

C++静态成员函数访问非静态成员的几种方法

https://www.cnblogs.com/rickyk/p/4238380.html 大家都知道C中类的成员函数默认都提供了this指针&#xff0c;在非静态成员函数中当你调用函数的时候&#xff0c;编译器都会“自动”帮你把这个this指针加到函数形参里去。当然在C灵活性下面&#xff0c;类还具备了静态成员和静…