TCP/IP Socket套接字C语言编程

  • 源代码尽供学习交流

头文件cnofig.h

/*
 * config.h 包含该tcp/ip套接字编程所需要的基本头文件,与server.c client.c位于同一目录下
*/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>const int MAX_LINE = 2048;
const int PORT = 6000;
const int BACKLOG = 10;
const int LISTENQ = 6666;
const int MAX_CONNECT = 20;

服务器端代码server.c

/*
 * server.c为服务器端代码
*/#include "config.h"int main(int argc , char **argv)
{/*声明服务器地址和客户链接地址*/struct sockaddr_in servaddr , cliaddr;/*声明服务器监听套接字和客户端链接套接字*/int listenfd , connfd;pid_t childpid;/*声明缓冲区*/char buf[MAX_LINE];socklen_t clilen;/*(1) 初始化监听套接字listenfd*/if((listenfd = socket(AF_INET , SOCK_STREAM , 0)) < 0){perror("socket error");exit(1);}//if/*(2) 设置服务器sockaddr_in结构*/bzero(&servaddr , sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //表明可接受任意IP地址servaddr.sin_port = htons(PORT);/*(3) 绑定套接字和端口*/if(bind(listenfd , (struct sockaddr*)&servaddr , sizeof(servaddr)) < 0){perror("bind error");exit(1);}//if/*(4) 监听客户请求*/if(listen(listenfd , LISTENQ) < 0){perror("listen error");exit(1);}//if/*(5) 接受客户请求*/for( ; ; ){clilen = sizeof(cliaddr);if((connfd = accept(listenfd , (struct sockaddr *)&cliaddr , &clilen)) < 0 ){perror("accept error");exit(1);}//if//新建子进程单独处理链接if((childpid = fork()) == 0) {close(listenfd);//str_echossize_t n;char buff[MAX_LINE];while((n = read(connfd , buff , MAX_LINE)) > 0){write(connfd , buff , n);}exit(0);}//ifclose(connfd);}//for/*(6) 关闭监听套接字*/close(listenfd);
}

客户端代码client.c

/*
 * client.c为客户端代码
*/#include "config.h"/*readline函数实现*/
ssize_t readline(int fd, char *vptr, size_t maxlen)
{ssize_t    n, rc;char  c, *ptr;ptr = vptr;for (n = 1; n < maxlen; n++) {if ( (rc = read(fd, &c,1)) == 1) {*ptr++ = c;if (c == '\n')break; /* newline is stored, like fgets() */} else if (rc == 0) {*ptr = 0;return(n - 1);    /* EOF, n - 1 bytes were read */} elsereturn(-1);       /* error, errno set by read() */}*ptr = 0; /* null terminate like fgets() */return(n);
}int main(int argc , char ** argv)
{/*声明套接字和链接服务器地址*/int sockfd;struct sockaddr_in servaddr;/*判断是否为合法输入*/if(argc != 2){perror("usage:tcpcli <IPaddress>");exit(1);}//if/*(1) 创建套接字*/if((sockfd = socket(AF_INET , SOCK_STREAM , 0)) == -1){perror("socket error");exit(1);}//if/*(2) 设置链接服务器地址结构*/bzero(&servaddr , sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(PORT);if(inet_pton(AF_INET , argv[1] , &servaddr.sin_addr) < 0){printf("inet_pton error for %s\n",argv[1]);exit(1);}//if/*(3) 发送链接服务器请求*/if( connect(sockfd , (struct sockaddr *)&servaddr , sizeof(servaddr)) < 0){perror("connect error");exit(1);}//if/*(4) 消息处理*/char sendline[MAX_LINE] , recvline[MAX_LINE];while(fgets(sendline , MAX_LINE , stdin) != NULL)   {write(sockfd , sendline , strlen(sendline));if(readline(sockfd , recvline , MAX_LINE) == 0){perror("server terminated prematurely");exit(1);}//ifif(fputs(recvline , stdout) == EOF){perror("fputs error");exit(1);}//if}//while/*(5) 关闭套接字*/close(sockfd);
}

Makefile

ALL:gcc server.c -o server -lmgcc client.c -o client -lm

运行,实现服务器与客户机之间的进程间通信

$ ./server &
$ ./client 127.0.0.1
this is a test
this is a test

当然,在两个终端中也是可以的,如下图:

Linux Socket C语言网络编程:TCP Socket相关推荐

  1. Linux C++服务器项目——网络编程1 (socket通信,服务端,客户端)

    牛客 C++高并发服务器开发 参考笔记 1.MAC地址 2 IP地址 2.1 简介 2.2 IP地址编址方式 2.3 子网掩码 3 端口 3.1 简介 3.2 端口类型 4 网络模型 4.1 OSI七 ...

  2. Linux Socket C语言网络编程:SCTP Socket

    Table of Contents SCTP介绍 SCTP(流控制传输协议) SCTP服务 SCTP封包格式 SCTP,TCP和UDP的比较 拥塞 开环拥塞控制 闭环拥塞控制 SCTP协议的各个功能如 ...

  3. Linux Socket C语言网络编程:Pthread Socket [code from GitHub, for study]

    pthreat socket three file in one directory config.h server.c client.c config.h /* * config.h 包含该tcp/ ...

  4. Linux Socket C语言网络编程:UDP Socket

    UDP简介 UDP与TCP相比,UDP是没有链接的协议,可以把他比作电子邮件,收信方不需要确认就可以接收邮件(不需要握手),这一点以TCP协议不同. 下面简单介绍GitHub上的开源项目TCP-Soc ...

  5. Linux Socket C语言网络编程:Select Socket

    Select Socket 你需要包含#include <sys/select.h> 结果 $ ./server & $ ./client 127.0.0.1accpet conn ...

  6. C语言网络编程:socket函数

    函数描述 头文件 <sys/types.h> <sys/socket.h> 函数使用int socket(int domain, int type, int protocol) ...

  7. Linux操作系统C语言网络编程学生在线考试系统(带完整项目源码)

    目录 一.项目功能 1.用户登录 2.教师登录 3.学生登录 二.需求分析 1.多用户登录,有并发需求. 2.需要数据库存储一堆信息. 三.软硬件开发平台 1.硬件 2.软件 四.技术点 1.使用并发 ...

  8. [windows网络编程]tcp/udp编程初步详解-转

    #pragma comment (lib,"ws2_32.lib") #include <Winsock2.h> #include <stdio.h> 如你 ...

  9. java socket ip_JAVA 网络编程 TCP/IP、Socket 和协议设计

    [JAVA 网络编程 TCP/IP.Socket 和协议设计] TCP/IP 协议简介 IP 首先我们看 IP(Internet Protocol)协议.IP 协议提供了主机和主机间的通信. 为了完成 ...

最新文章

  1. TypeScript 3.4.5 发布,修复节点运行问题
  2. Spring boot修改Servlet配置
  3. 地图画指定区域_零基础学CAD绘制一张桌子为例,使亲们更好地熟悉三维绘图环境...
  4. 【Python】tqdm创建进度条
  5. 大三软件工程小项目-小技术集合-客户端界面重画
  6. Spring的Annotation使用注意
  7. 奇异值分解(SVD)详解
  8. Atitt 常见的拖欠费用的公司与个人黑名单 陕西西部安全网 2007-2008 西安 一个月 25000 西安盛世涅槃 2007 西安 1m 25000 Sicyi msc 2007 n
  9. python水仙花数
  10. unicode什么意思中文_请问Unicode中文,日文,韩文,西欧语言等的编码区间是什么?...
  11. ei会议和ei源刊的区别_Ei期刊和ei会议论文有哪些区别
  12. 2号团队-团队任务5:项目总结会
  13. linux下运行testng,TestNG执行程序
  14. 简述html的文档基本结构,【简答题】简述 HTML 文档的基本结构。
  15. PTA在一大堆数据中找出重复的是一件经常要做的事情。现在,我们要处理许多整数,在这些整数中,可能存在重复的数据。
  16. Android 科大讯飞语音SDK集成步骤
  17. ARM芯片外围电路介绍
  18. ListBox的基本用法
  19. 后疫情时代,虚拟音乐会能为行业带来怎样的新思考?
  20. pajek15-18:网络

热门文章

  1. Springboot自动配置原理入门
  2. (4.32)自定义函数整理大全
  3. Shell基础(一):Shell基础应用、简单Shell脚本的设计、使用Shell变量、变量的扩展应用...
  4. OkHttp和Volley对比
  5. 2016年社招面试小结
  6. web.config forms节点中的属性的含义和用途
  7. java两种不同单例模式_关于Java里的两种单例模式
  8. 指定开局五子棋c语言代码,C语言案例:控制台版本的五子棋游戏【代码】
  9. matlab的7.3版本是什么_MX Linux 19.3 发布,Debian和antiX Linux的混合版本
  10. java网站短信接口_网云JAVA短信接口API