server

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h> #define BUF_SIZE 1024 void err_handler(char *msg); int main(int argc, char **argv) {
int srv_sock, cli_sock;
char msg[BUF_SIZE];
int str_len; struct sockaddr_in srv_addr, cli_addr;
socklen_t cli_adr_sz; if (argc != ) {
printf("Usage : %s <port>", argv[]);
exit();
} srv_sock = socket(PF_INET, SOCK_STREAM, );
if (srv_sock == -) {
err_handler("socket() error");
} memset(&srv_addr, , sizeof(srv_addr));
srv_addr.sin_family = AF_INET;
srv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
srv_addr.sin_port = htons(atoi(argv[])); if (bind(srv_sock, (struct sockaddr *) &srv_addr, sizeof(srv_addr)) == -) {
err_handler("bind() error");
} if (listen(srv_sock, ) == -) {
err_handler("listen() error");
} cli_adr_sz = sizeof(cli_addr); for (int i = ; i < ; ++i) {
cli_sock = accept(srv_sock, (struct sockaddr *) &cli_addr, &cli_adr_sz);
if (cli_sock == -) {
err_handler("accept() error");
} else {
printf("connected client %d\n", i + i);
} while ((str_len = read(cli_sock, msg, BUF_SIZE)) != ) {
write(cli_sock, msg, str_len);
}
close(cli_sock);
} close(srv_sock);
return ;
} void err_handler(char *msg) {
fputs(msg, stderr);
fputc('\n', stderr);
exit();
}

client

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h> #define BUF_SIZE 1024 void err_handler(char *msg); int main(int argc, char **argv) {
int sock;
char msg[BUF_SIZE];
int str_len;
struct sockaddr_in srv_addr; if (argc != ) {
printf("Usage : %s <port>", argv[]);
exit();
} sock = socket(PF_INET, SOCK_STREAM, );
if (sock == -) {
err_handler("socket() error");
} memset(&srv_addr, , sizeof(srv_addr));
srv_addr.sin_family = AF_INET;
srv_addr.sin_addr.s_addr = inet_addr(argv[]);
srv_addr.sin_port = htons(atoi(argv[])); if (connect(sock, (struct sockaddr *) &srv_addr, sizeof(srv_addr)) == -) {
err_handler("connect() error");
} else {
printf("connected .........");
} while () {
fputs("Input msg(Q to quit):", stdout);
fgets(msg, BUF_SIZE, stdin);
if (!strcmp(msg, "q\n") || !strcmp(msg, "Q\n")) {
break;
}
write(sock, msg, strlen(msg));
str_len = read(sock, msg, BUF_SIZE - );
msg[str_len] = ;
printf("Msg form srv : %s", msg);
} close(sock);
return ;
} void err_handler(char *msg) {
fputs(msg, stderr);
fputc('\n', stderr);
exit();
}

Makefile

all a_b:
gcc -o srv main.c -g -Wall
gcc -o cli client.c -g -Wall

linux_c_tcp_example的更多相关文章

随机推荐

  1. JAVA 发送各种邮箱邮件 javamail

    QQ邮箱 /** * 单条发送 * @param mail 邮件对象,包含发送人.邮件主题.邮件内容 * @param recipients 收件人 * @throws AddressExceptio ...

  2. sqli-labs level 2

    来到第第二关 首先在后面添加一个 单引号看下报错信息 发现这里多多了一个引号  尝试去掉单引号看下回显结果   :    and 1=2 可以发现这里不需要添加单引号进行闭合,可以直接控制,所以接下来 ...

  3. H7-TOOL脱机烧录器功能开源发布

    H7-TOOL汇总帖:https://www.cnblogs.com/armfly/p/12283459.html 当前已经对STM32F030,STM32F103,STM32F429,STM32F7 ...

  4. Spring的AOP开发(基于ApsectJ的注解)

    创建项目,导包 编写目标类并配置 创建OrderDao package com.rick.aop.demo1; public class OrderDao { public void save() { ...

  5. .net core文件系统简介

    在asp.net core程序中,我们可以通过如下代码开启对Web 根目录内的文件静态访问功能: app.UseStaticFiles(); 如果要提供更高级的选项,例如:将其它的物理文件夹下的文件作 ...

  6. 使用WinDbg分析蓝屏dump原因

    大多数人或许都经历过系统蓝屏问题,然而大多数人不清楚该怎么处理蓝屏问题,这里主要对系统蓝屏做一些解释,同时介绍下蓝屏问题分析工具WinDbg分析蓝屏问题的一般步骤. 微软官方对蓝屏的定义是,当系统遇到 ...

  7. MQTT 协议学习:007-Keep Alive 连接保活 与 对应报文(PINGREQ、PINGRESP)

    背景 keep alive 是 CONNECT 报文中可变头的一部分. 我们提到过 Broker 需要知道 Client 是否非正常地断开了和它的连接,以发送遗愿消息.实际上 Client 也需要能够 ...

  8. SpringBoot#RestControllerAdvice

    __震惊! 不可避免的访问一些控制器会产生一些异常,这些异常不经处理传递到前台页面,会很难看. 涉及到的注解: org.springframework.web.bind.annotation.Rest ...

  9. objectarx 批量倒角

    这个插件支持AcDbPolyline的倒角,封闭的和没封闭的都可以.刚开始做的时候,发现倒一个角借助云幽课堂里的代码就可以做,后来做一条从左开始画的非封闭的多段线,发现向上凹和向下凹的角不能同时被倒, ...

  10. Django ORM中常用的字段类型以及参数配置

    一.数值型 AutoField对应int(11).自增主键,Django Model默认提供,可以被重写. BooleanField对应tinyint(1).布尔类型字段,一般用于记录状态标记. De ...