Linux tcp_socket实例
来源:互联网 发布:杭州汉聚网络老板 编辑:程序博客网 时间:2024/06/05 19:50
一、利用tcp协议、socket模拟实现网络通信
网络中不同主机间的通信,实质上是网络中两个唯一的进程间通信,而IP地址加端口号可以表示网络中唯一的一个进程,即socket。tcp协议则可以实现全双工通信,同时收发数据。IP可以使用ifconfig查看本机IP为10.100.32.52,端口使用8080端口。
二、代码实现
1、创建源文件并编写Makefile
Makefile代码
.PHONY:allall:tcp_server tcp_clienttcp_server:tcp_server.c gcc -o $@ $^ tcp_client:tcp_client.c gcc -o $@ $^ .PHONY:cleanclean: rm -rf tcp_server tcp_client
2.tcp_server.c
#include <string.h>#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <stdlib.h>#include <arpa/inet.h>#include <netinet/in.h>int startup(const char *_ip,int _port){ //创建socket int sock = socket(AF_INET,SOCK_STREAM,0); if(sock < 0){ perror("socket"); exit(2); } struct sockaddr_in local; local.sin_family = AF_INET; local.sin_port = htons(_port); local.sin_addr.s_addr = inet_addr(_ip); //绑定IP与端口 if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0){ perror("bind"); exit(3); } //监听 if(listen(sock,10)<0){ perror("listen"); exit(4); }; return sock;}static void usage(const char *proc){ printf("%s [ip][port]\n",proc);}int main(int argc,char* argv[]){ if(argc != 3){ usage(argv[0]); return 1; } int listen_sock = startup(argv[1],atoi(argv[2])); struct sockaddr_in remote; socklen_t len = sizeof(remote) ; char buf[1024]; while(1){ int sock = accept(listen_sock,(struct sockaddr*)&remote,&len); if(sock < 0){ perror("accept"); continue; } printf("client ip:%s,port:%d\n"\ ,inet_ntoa(remote.sin_addr),ntohs(remote.sin_port)); while(1){ ssize_t s = read(sock,buf,sizeof(buf)-1); if(s > 0){ buf[s] = 0; printf("client say# %s\n",buf); write(sock,buf,strlen(buf)); }else if(s == 0){ printf("client quit!\n"); break; } } }}
- tcp_client.c
#include <string.h>#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <stdlib.h>#include <arpa/inet.h>#include <netinet/in.h>static void usage(const char *proc){ printf("%s[server_ip][server_port]\n",proc);}int main(int argc,char* argv[]){ if(argc != 3){ usage(argv[0]); exit(1); } int sock = socket(AF_INET,SOCK_STREAM,0); if(sock < 0){ perror("socket"); return 1; } struct sockaddr_in peer; peer.sin_family = AF_INET; peer.sin_port = htons(atoi(argv[2])); peer.sin_addr.s_addr = inet_addr(argv[1]); char buf[1024]; if(connect(sock,(struct sockaddr*)&peer,sizeof(peer))<0){ perror("connect"); return 3; } while(1){ printf("Please Enter#"); fflush(stdout); ssize_t s = read(0,buf,sizeof(buf)-1); if(s>0){ buf[s-1] = 0; write(sock,buf,strlen(buf)); ssize_t _s = read(sock,buf,sizeof(buf)-1); if(_s > 0){ buf[_s] = 0; printf("sever echo# %s\n",buf); } } } close(sock);}
三、测试结果
在本机开启两个终端间,或在局域网内两台主机间测试
1.先开启server端服务器
这里没有任何变化,是因为没有客户端连接,server一直在阻塞式的等待
2.开启client客户端
这时client端提示输入,server端则出现client的socket
3.交互
阅读全文
0 1
- Linux tcp_socket实例
- Linux下C/S模型的TCP_socket通信代码
- tcp_socket修改三个表
- TCP_Socket及源代码01
- 【cc3200】tcp_socket的基本使用
- Java学习-Tcp_Socket通信原理
- 基于tcp_socket通信的网络编程
- 多线程编程示例(基于tcp_socket)
- Java学习-Tcp_Socket实现多线程通信
- 【java编程】TCP_Socket网络编程之用户登陆
- tcp_socket绑定(bind)失败---Address already is use原因
- Linux音频编程实例
- Linux路由器配置实例
- Linux脚本实例
- linux find 命令实例
- Linux信号量编程实例
- linux策略路由实例
- linux find 命令实例
- Android 图片移动和拖动
- 【TensorFlow】DNNRegressor 的简单使用
- 知名Html5 Canvas Javascript库对比
- HTML5利用FormData对象实现显示进度条的文件上传【转】
- 有趣又有料:任意操控静态图片中人的眼球
- Linux tcp_socket实例
- 关于qemu的二三事(5)————qemu源码分析之参数解析
- python基础笔记-6
- Java中静态代码块的用法 static用法详解
- FatMouse' Trade
- 6月1日到7月1日‘小目标’
- QiYuAdmin-安装项目出现的问题(SpringBoot实战)
- Linux文件系统和文本编辑器
- 记录自己的Markdown入门学习点滴